当子类继承的父类是不确定的模板类,必须要 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 合作在算法题中来专注于实现逻辑操作,省略具体细节内容。降低了指针和内存的耦合度。


std::stringstream 是 C++ 标准库 <sstream> 中的一个类,把字符串当作一个流(Stream)来处理,用 >> 和 << 操作符来操作它。
它的用法主要分为两大类:格式化拼接字符串分割

  1. 格式化拼接(把各种类型转为 string)会自动处理类型转换

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    std::stringstream ss;
    int id = 101;
    double score = 95.5;
    std::string name = "Alice";

    // 使用 << 写入数据(就像 cout)
    ss << "User: " << name << ", ID: " << id << ", Score: " << score;

    // 使用 .str() 导出完整的字符串
    std::string result = ss.str();
    std::cout << result << std::endl;
    // 输出: User: Alice, ID: 101, Score: 95.5
  2. 字符串分割(解析字符串)它默认以 空格、制表符、换行符 作为分隔符

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // 按空格分割单词
    std::string s = "C++ is fun to learn";
    std::stringstream ss(s); // 初始化时传入字符串
    std::string word;

    // 使用 >> 提取数据(就像 cin)
    // 它会一个单词一个单词地读,直到结束
    while (ss >> word) {
    std::cout << "Word: " << word << std::endl;
    }

    按特定字符分割(如逗号),配合 std::getline

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // "100,200,300"
    int sumString(string data) {
    stringstream ss(data); // 把原始字符串喂给流
    string item;
    int total = 0;

    // 用 getline 分割逗号
    while (getline(ss, item, ',')) {
    // 把分割出来的字符串 item 转成整数并累加
    total += stoi(item);
    }
    return total;
    }

RAII (Resource Acquisition Is Initialization)资源获取即初始化:指在对象初始化时,会自动获取资源,并在对象销毁时自动释放资源(且不抛出异常)。
具体使用场景:STL 容器,智能指针,互斥锁,线程,std::function 等。
若自定义 RAII 管理资源,即在自定义特殊成员函数时,需要同时显示地处理5个函数:构造函数、析构函数、拷贝构造函数、赋值运算符函数、移动构造函数。