【C++】17. map []操作符、insert()、emplace()

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;
}
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值