本来只是想草草读一下这篇文章:https://142857.red/book/stl_map/
但是还是发现一些值得记录的点,在这里记录一下:
[]读取不存在的key会报错
map<string, int> config = {
{"timeout", 985},
{"delay", 211},
};
print(config["timeout"]); // 985
print(config["tmeout"]); // 默默返回 0
推荐所有的读取都用at:
map<string, int> config = {
{"timeout", 985},
{"delay", 211},
};
print(config.at("timeout")); // 985
print(config.at("tmeout")); // 该键不存在!响亮地出错
[]会自动创建不存在键值
map<string, int> config = {
{"delay", 211},
};
config.at("timeout") = 985; // 键值不存在,报错!
config["timeout"] = 985; // 成功创建并写入 985
因此它引入了一条原则:
- 读取元素时,统一用 at()
- 写入元素时,统一用 []
C++不是python,auto要显示指定引用
void PeiXunCpp(string stuName) {
auto stu = stus.at(stuName); // 这是在栈上拷贝了一份完整的 Student 对象
stu.money -= 2650;
stu.skills.insert("C++");
}
在python类似的写法是没有问题的,但是在C++中这个stu左边的auto
没有显示指定&
为引用,则在实际构造的过程中会发生一次拷贝构造函数,并且后续的修改不会贴回到stus
的字典里。
End.