C++ 笔记
当子类继承的父类是不确定的模板类,必须要 this-> 来访问父类的成员。和子类无关。
1 | template<typename T> |
负数取反优先位运算 h = h & 0x7fffffff(0111 1111 … 1111),最高位清零不会越界
对于 vector<vector<int>>,push_back 可以把 {a, b} 作为 initializer_list<int> 整体隐式构造为临时对象 vector<int> 再移动(经过编译器优化后与 emplace_back 效果一致,直接在目标位置构造);但 emplace_back 需要显式构造 .emplace_back(vector<int>{a, b}),否则重载不明确,仅作为无类型的参数列表无法推断为 std::initializer_list<T> 也无法调用任何构造函数。
对于 pair<int,int>,.emplace(i, 0) 模板推导匹配成功,可直接调用 pair<int,int> 的构造函数;push 则同上必须传入临时对象即 .push({i, 0})。
因此 emplace 和 push 的用法取决于容器元素类型的构造函数
ASCII码中,大写字母(A–Z) 的范围是:A = 65, Z = 90;小写字母(a–z) 的范围是:a = 97, z = 122。大小写相差32,即 'a' - 'A' = 97 - 65 = 32。数字是 0-9 排列。
C++ 所有标准库“区间函数”基本都是左闭右开(fill, sort, reverse, remove, replace, copy, transform, accumulate, etc.)
迭代器主要是对 STL 容器的指针操作进行了封装,来模拟指针的行为,让开发者在使用时不必关注和理解容器内存细节,专注于逻辑的操作,使得连续内存的容器如 vector 和非连续内存地址的容器如 list 都能统一的使用,比如说 ++ -- 来管理指针的移动操作。另外可以与标准库的一些方法如 find max_element 合作在算法题中来专注于实现逻辑操作,省略具体细节内容。降低了指针和内存的耦合度。

