3月16日
- 局部变量,只要程序执行到 } 的时候,变量就会被销毁,内存也会被回收
- 当使用cin读取字符串时,会忽略空白符(空格、制表符、退格符、终止符)
- \t是制表符,按键盘上的Tab键就是,它是一个字符,但显示的时候通常会是按8个字符宽度跳到下一个制表位置
- 使用转义符\b一次,光标将从原应该显示的位置向前退一格
- 终止符\0
是调用成员函数,能容纳最多4个字符,但只有最后一个字符有效string dd = "fuck you"; string ff(dd.size(), 'h');
- cout << s 将s的所有字符 不做任何格式修改的保存到s中
- cin >> s 将is中的所有字符,忽略空白符的保存到s当中
- "+" 两端不能都是字符串字面量或char类型值
- string::size_type = ff.size(); size_type是string表示长度的变量
- 可以不使用using namespace; 来声明,而是用 using std::out; 来逐一进行using声明
- 不对称区间[n,m)比对称区间[n,m]好,因为不对称区间有m-n个元素,而对称区间有m-n+1个元素
- 推荐使用 != 而不是 < (没看懂他说的原因,好像是因为使用<会至少输入n-m个而不是n-m个,待解释?)
- <ios> 定义streamsize类型,是输入输出的长度
- <iomainip> 定义控制符setprecision,说明希望输出中有多少位有效数字。用法:cout << setprecision(3) << 1.23456; 输出为1.23,控制其之后输出的有效数字
- 也可以用sizestream cc = cout.precision(3)来设置精度,返回的是原有的精度,3用来设置想要的精度
- float只有6位有效数字,在使用浮点数进行计算时,几乎都是使用double(至少十五位?),甚至double的速度更快
- double sum = 0 在初始化时系统会把0转化为0.0,可以在定义时定义为0.0,不过对系统的开销一样,无所谓
- 全局变量,或静态局部变量,如int在全局域中声明的变量会自动初始化为0
- 如果变量是在局部域中定义的,则系统不会向它提供初始值0,这些对象被认为是未初始化,其值随机(有的编译器可能会为你初始化为0,但千万别依赖于这种可能行为,因为它会给你的程序带来未定义的行为)
- 推荐使用标准库的size_type,例如typedef vector<double>::size_type vec_sz;
- <algorithm>库中包含了sort函数,sort(a,b)可以对区间[a,b)进行非降序排列,max(a,b)也在这头文件里
- sort(homework.begin(), homework.end()); 就可以排序,不是创建新的vector,而是对homework进行重排
- 如果一个表达式中同时存在普通的整形和无符号类型的整形,运算的结果一定是正数,就算结果小于0,不过如果小于0的话就是个随机(?)正数了
- 使用vector时,要包含头文件<vector>,平常都不用包含估计是opencv.hpp里已经包含了
- v.end(); 返回的是v中最后一个元素的下一个位置(?)
- 当retun 0 时表示程序正常退出,一般来说任何非0值都代表着某种非正常退出
- <stdexcept>库中包含domain_error对象,例:throw domain_error("size should not be 0");
vector<double> homework; const vector<double> &hwk = homework;
表示hwk是homework的只读别名字,好处是
- 系统可以直接访问实参,而不是复制实参,并且不会改变形参的值(否则实参的值也会改变)
- 因为形参是对常量的引用,所以参数既可以是常量vector,也可以是正常的vector(amazing)
- 由于是引用实参,避免了复制实参的开销
- 与非常量引用的形参对应的实参必须是一个左值,所谓左值就是一个非临时量(比如直接使用fuck()作为参数是不行的),因为如果这样当函数返回时输入的形参就会被销毁,相当于我们修改了一个无法访问的数据
- 一个非常好的经验是,避免一个单独的语句产生多个副作用