map的几种赋值方法比较
学习或者工作中经常会用到map,赋值是常用的操作,map有好几种赋值方法,哪一种方式最有效?网上了解了一些资料,在这里总结一下。
常用的赋值方式有如下几种。
// 1) Assignment using array index notation
Foo["Bar"] = 12345;
// 2) Assignment using member function insert() and STL pair
Foo.insert(std::pair<string,int>("Bar", 12345));
// 3) Assignment using member function insert() and "value_type()"
Foo.insert(map<string,int>::value_type("Bar", 12345));
// 4) Assignment using member function insert() and "make_pair()"
Foo.insert(std::make_pair("Bar", 12345));
// 5)C++ 11
Foo.emplace("Bar", 12345);
一、 [] 与 insert这两种方式存在语义差异
[]
将替换旧值(如果有)insert
将忽略新值(如果已经存在旧值)
二、几种 insert 方式的比较
-
std::map<std::string, int>::value_type 和 std::pair<std::string const, int>之间没有重要的差别
std::make_pair("Bar", 12345) 相比 std::pair<std::string, int>("Bar", 12345)开销更少
一般来说,[] 用于更新,insert会忽略重复项。std::make_pair遵循DRY准则,不会重复自身。
启用C++ 11的情况下,推荐使用emplace,最简单也是最效的方式。(它的行为是insert,但是它构造了新的元素)
学习STL的时候,看到前辈表达了STL的爱情观hh,分享一下。
“前段日子读了STL的源码,大师级的作品真是精致到让人喟叹。当然,有时候你在网上还是可以看到很多对STL的批评,例如,对编译器要求很高,很多时候出错了的话,打印出来的错误信息总是让人摸不着头脑的。这确实是比较头疼的一个问题,因为模板编程,编译的过程总是分为两个部分的,是先要找到相应的模板,然后才对模板进行具现化,有时候单纯从模板来看,似乎很完整,没有什么问题呀,可是一旦投入使用了,才发现找不到合适的具现化版本,于是又要搞特化了。某日在路上行走,突然想起爱情这个难题,突然想起具现化,
突然觉得爱情就像是一个模板类,是想象,没有实现的时候,它看起来很完美,很丰富,可是爱情一旦具现化,它便成了独此一家的一个类,想象的空间本就狭窄了,倘若需求比较复杂,还须得有偏特化版本,不然就要出错。每个女人心目中的恋爱对象都是完美的,是那种选择性的完美,她爱的并不是那个实体,而是加诸于该实体上的想象。”