欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

注意:

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;
}
相关标签: c++