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
即,没有此键值则添加,有此键值则重新赋值。

注意:

mapvalue指针时,不能少了判断该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::mapstd::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;
}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐