3月17日继续,4.2开始
- sort()函数每次都是调用 < 来进行比较,如果是struct类型的就木有意义了
bool compare(const Student&x, const Student&y) { return x.height < y.height; }
sort函数的第三个参数可以接一个自己定义的返回值为bool的函数- <algorithm>函数库里的max()函数要求两个参数的类型一样,所以不能用普通的int,必须定义一个string::size_type去和myStirng.size()比较
- 使用setw(int)函数来对输出的字符长度进行扩充,但对宽度的修改是暂时的,也就是说,每个标准输出运算符在完成了它的输出动作之后就马上会还原重置流的宽度。也可以使用cout.width(7);来实现,只影响下一次cout操作
cout << setw(7) << max(ff.size(), jj) << 3 << "ffff";
- 使用预处理指令检查可以保证头文件只被包含一次,#ifdef一定要在第一行,因为C++系统环境会对这种形式的文件进行检测,不过varialbe已经定义了的话,那他们就根本不会第二次读这个文件
#ifndef GUARD_median_h //ifndef要在第一行,就算是注释也要在他下面 void show(); #define GUARD_median_h #endif
- 在头文件中尽量不使用using std::vector 一类的话,因为要保证头文件尽量干净,不影响到全局,所以直接使用std::vector。但在源文件中可以使用using声明,因为源文件是局部的决策,不会影响全局
- 同时修改两个vector,通过引用&来修改输入参数的值
vector<Student_info> extract_fails(vector<Student_info>& students) { vector<Student_info> pass, fail; for (vector<Student_info>::size_type i = 0; i < students.size(); i++) { if (failTest(students[i])) fail.push_back(students[i]); else pass.push_back(students[i]); } students = pass; return fail; }
- vector为了快速随机访问而做了优化,优化的代价是插入或删除一个非末尾元素时,开销非常大,开销与元素的数量的平方成正比(?)
- 删除vector中元素的函数是student.erase(students.begin()+i); 参数类型必须为迭代器
- 当使用iterator时为使用迭代器改变容器里的值,使用const iterator是只读模式
- iterator可以转化为const iterator,反之则不能。students.begin()返回的是一个iterator类型的值,会有一个自动(隐式?)转换
- .的操作优先级比*高,所以iterator指向元素必须用()包裹,例:(*iterator).name;
- 删除iter表示的元素会使被删除元素之后的所有迭代器无效(包括.end())。erase函数会返回一个迭代器,它指向被删除元素之后的下一个元素
- 如果students的类型不是支持根据索引随机访问的容器,那么很可能students.begin() + i 无法通过(无+操作)
- vector顺序访问好,适用于只在末尾增加删除的存储。list适合在中间插入删除
- 从vector中删除一个元素时,会使这个元素之后的迭代器失效;使用push_back给一个迭代器增加元素时,会使所有指向这个vector的迭代器失效,因为新元素分配空间可能会引起整个vector的重新分配
- list的push_back不会影响其他迭代器,erase也只会影响操作的迭代器
- list使用自己的成员函数sort进行排序。例:students.sort(compare)
- string.substr(int,int),第一参数是开始的位置,第二个是长度,闭区间
- <string>库中的getline函数可以输入包含空格的字符串,直到遇到行终止符,例:getline(cin, str);
- 如果向vector<>ret的末尾添加vector<>bottom,可以使用insert函数。例:ret.insert(ret.end(), bottom.begin(), botton.end());
- 也可以使用copy(iter,iter,iter)来操作,例:copy(bottom.begin(), bottom.end(), back_inserter(ret)); 表示在末尾添加bottom的所有元素,它接受的三个参数都是迭代器类型
- c.rbegin()和c.rend()表示容器中的最后一个元素和第一个元素之前的一个元素,以相反的方向访问元素
- c.erase(b,e)表示删除区间[b,e)之间的元素
- v.resize(n) 如果n小于v.size()则截断后面的元素
- <cctype>库有很多对字符串操作的函数,详见 点击打开链接
坑:
- inline内联函数还不清楚
看到4.2了,明天继续 - -