当子类继承的父类是不确定的模板类,必须要 this-> 来访问父类的成员。和子类无关。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
template<typename T>
class Base {
protected:
int x = 10;
};
template<typename T>
class Derived : public Base<T> { // 父类依赖模板参数 T
public:
void print() {
cout << this->x << endl; // ✅ 必须 this->
}
};

template<typename T>
class Base {
protected:
int x = 10;
};
template<typename T>
class Derived : public Base<int> { // 父类类型固定,不依赖 T
public:
void print() {
cout << x << endl; // ✅ 不需要 this->
}
};

负数取反优先位运算 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})
因此 emplacepush 的用法取决于容器元素类型的构造函数


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 合作在算法题中来专注于实现逻辑操作,省略具体细节内容。降低了指针和内存的耦合度。