跳至正文

std::map学习笔记

  • C++

本来只是想草草读一下这篇文章: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.

标签:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注