17. map []操作符、insert()、emplace()
程序员文章站
2022-03-01 22:18:21
...
1. std::map 的 []
操作符
对于 std::map
容器来说,调用[]
操作符会自动创建一个value为空的键值对
std::map<std::string,int> name_age_map;
name_age_map["Jack"] = 25;
注意上面这句name_age_map["Jack"] = 25;
,当name_age_map
中没有"Jack"
的key时,[]
操作符会自动创建一个"Jack"
的关键字插入到name_age_map
中,并将其赋值为25
。
即,没有此键值则添加,有此键值则重新赋值。
注意:
当map
的value
是指针
时,不能少了判断该key
存不存在,如果不进行判断而直接使用map[key]->func()
就会在运行时出现段错误
,因为你直接调用[]
就直接给map
插入了一个key
,并且其对用的值为空指针nullptr
。
错误示范:
class Base{
public:
void func();
}
// ......省略一些过程
std::map<std::string,std::shared_ptr<Base>> map_;
// ......省略一些过程
map_["Jack"]->func();
上面面这种错误情况,map_["Jack"]->func();
这句话之前需要判断map
中是否存在"Jack"
关键字,否则可能会出现当不存在"Jack"
时,自动创建一个<"Jack",nullptr>
,从而导致段错误
正确做法是:
class Base{
public:
void func();
}
// ......省略一些过程
std::map<std::string,std::shared_ptr<Base>> map_;
// ......省略一些过程代码
if(map_.count("Jack")){
map_["Jack"]->func(); //这样就不会在没有"Jack"时插入一个<"Jack",nullptr>
}
2. insert 和 emplace
对于两种map
容器std::map
、std::unordered_map
:insert(std::make_pair(key, value))
和 emplace(std::make_pair(key, value))
重复插入同一个key
的操作,二者都不会替换原先的key
对应的value
值,只有索引[]
操作会改变value
。
3.可以使用以下方式插入key-value
键值对 和 更新键值value
:
- 如果不存在
key
,则使用insert()
和emplace()
进行插入键值对;通过前面的知识,我们知道,也可以直接使用[]
的当时直接插入键,并进行赋值。 - 如果存在
key
,则使用[]
进行赋值;
if(map.count(key)){
map.insert(std::make_pair(key, value));
map.emplace(std::make_pair(key, value));
//map[key]=value; //这种方式也可以
}else{
map[key]=value;
}