1. std::map 如果在添加元素前,直接去取 key-value,会怎样 ?
先说答案,map 在添加元素前,直接使用会给 key 添加默认的 value!
2. 问题背景
某项目代码报出个严重的bug,具体现象是某个 map 的变量,还没有添加元素,但是获取到数据。经过各种定位发现代码的一个bug,就是 map 变量的使用问题:
std::map<std::string, int> map_Test;
int getKeyValue(std::string key)
{
int value = map_Test[key];
if(map_Test.count(key) != 0UL) {
xxxx(value);
}
}
上面代码发现问题没有? 问题就是 map 在取值前,要find 或者count不为0后才能取值。否则map 会给取得key,赋值默认得值。比如上面得 就会给 赋值默认的值 0;
3. 测试代码验证
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
std::map<std::string, int> mTest;
mTest["a"];
auto it = mTest.find("a");
if (it != mTest.end()) {
cout << "find map: " << mTest["a"];
}
return 0;
}
上面代码编译运行,结果如下:
g++ map.cpp
./a.out
find map: 0
4. 结论
c++ std::map 在取值前,要先 find 到值,或者count 值不为0才能取值。如果 map 没有添加key-value,直接取 key,会获取到默认类型的 value。