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 合作在算法题中来专注于实现逻辑操作,省略具体细节内容。降低了指针和内存的耦合度。
std::stringstream 是 C++ 标准库 <sstream> 中的一个类,把字符串当作一个流(Stream)来处理,用 >> 和 << 操作符来操作它。
它的用法主要分为两大类:格式化拼接和字符串分割。
格式化拼接(把各种类型转为 string)会自动处理类型转换
1
2
3
4
5
6
7
8
9
10
11
12std::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字符串分割(解析字符串)它默认以 空格、制表符、换行符 作为分隔符
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::getline1
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个函数:构造函数、析构函数、拷贝构造函数、赋值运算符函数、移动构造函数。
