【学习笔记】C/C++

1. C语言中的 scanf() 函数

该函数包含在头文件 <stdio.h> 或者 <cstdio> (在C++中使用时)

函数的返回值指的是

所输入的数据与格式字符串匹配的次数。

意思就是该函数返回已成功赋值的数据项数,出错时返回 EOF (End_of_File,是一个预定义常量,表示文件末尾,值为-1)

简单示例:

 1 #include <stdio.h>
 2 
 3 int main(void)
 4 {
 5     int a, b;
 6     int input = scanf("%d %d", &a, &b);
 7     printf("input = %d
", input);
 8     
 9     return 0;
10 }

此时输入 1 2 

得到输出 input = 2 

上述结果表示正确匹配,若出现错误,如输入 1 a 

第二个值匹配失败,整型变量b无法得到字符‘a’,依旧是一个未赋值前不确定的值,则此时输出结果为 input = 1 

总之,我们可通过函数scanf( )返回值,来检测输入格式的正确性。

2. C++类与对象

2.1 问题:我们需要将一个类的所有实例都保存在一个容器中,同时又不需要类的使用者进行其他的操作,该如何实现?

方法:在类中定义一个static类型的容器作为类的成员变量,构造对象时将对象的地址添加到容器中,析构时再将其从容器中删除。

 1 #include <iostream>
 2 #include <list>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 class MyClass {
 8 protected:
 9    int value_;
10 public:
11    static list<MyClass*> instances_;
12    MyClass(int val);
13   ~MyClass();
14    static void showList();
15 };
16 
17 list<MyClass*> MyClass::instances_;
18 
19 MyClass::MyClass(int val) {
20    instances_.push_back(this);
21    value_ = val;
22 }
23 
24 MyClass::~MyClass() {
25    list<MyClass*>::iterator p =
26       find(instances_.begin(), instances_.end(), this);
27    if (p != instances_.end())
28       instances_.erase(p);
29 }
30 
31 void MyClass::showList() {
32    for (list<MyClass*>::iterator p = instances_.begin();
33         p != instances_.end(); ++p)
34       cout << (*p)->value_ << endl;
35 }
36 
37 int main(int argc, char **argv) {
38    MyClass a(1);
39    MyClass b(10);
40    MyClass c(100);
41    MyClass::showList();    // 输出的结果为1,10,100
42    return 0;  
43 }

3. 生成随机数序列

3.1 C语言中 rand() 函数用来产生随机数,但这不是真正意义上的随机数,是伪随机数。

它是以一个数(通常称为种子)为基准推算出来的一系列数,当这系列数很大时,就会服从正态公布,从而相当于产生了随机数。

当计算机正常开机后,这个种子的值是定了的,除非你破坏系统,才能改变这个种子的值。

C++提供了 std::srand() 函数,其原型是 void srand( int a) ,利用 srand((unsigned int) (time(NULL)) 是一种产生不可预见的随机序列的方法,因为每一次运行程序的时间是不同的。

3.2 以当前时间为参数重置随机数种子

如果没调用 srand() ,你会发现你每次运行程序, rand() 得到的序列值是不变的,然后 srand 里参数相同时 rand() 得到的序列也将相同。

std::srand(time(0)) 的作用就是让得到的序列看上去更贴近随机的概念。

等有空把遇到的错误和更标准的方法总结一下。

4. Lambda表达式

为何使用 Lambda ?

4.1 距离

很多人认为,让定义位于使用的附近很有用。这样就无需翻阅很多源代码,以了解函数。修改代码也很简单。

Lambda 表达式是不错的选择,而函数是不好的选择,因为不能内部定义其他函数,定义可能离使用的地方很远。函数符是个不错的选择,可以在函数内部定义类(包含函数符类)。

4.2 简洁

函数符代码要比l Lambda 代码更加繁琐,函数和 Lambda 的简洁程度相当。

4.3 效率

三种方法相对效率取决于编译器的内联。函数指针阻止了内联,因为编译器传统上不会内联其他地址被获取的函数,因为函数地址的概念意味着非内联函数。而函数符和 Lambda 通常不会阻止内联。

4.4 功能

Lambda 表达式可访问作用域内的任何动态变量,可以采用取值、引用的形式进行捕获。

参考资料

[1] c++随机数生成 http://blog.sina.com.cn/s/blog_79ab4be10100uzrj.html

[2] C++产生随机数一直重复的问题 https://www.csdn.net/gather_22/MtzakgzsMTUtYmxvZwO0O0OO0O0O.html

原文地址:https://www.cnblogs.com/phillee/p/10647808.html