哪种方式为地图分配值最有效?或者它们都针对相同的代码进行了优化(在大多数现代编译器上)?
// 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));
(我知道我可以进行基准测试并检查编译器输出,但这个问题现在出现了,我手边唯一的东西就是我的手机......呵呵)
首先,两者之间存在语义差异[]
and insert
:
-
[]
will replace旧值(如果有)
-
insert
will ignore新值(如果旧值已存在)
因此,一般而言,比较两者是没有用的。
关于插入版本:
-
std::map<std::string, int>::value_type
is std::pair<std::string const, int>
所以 3 和 4 之间没有(重要的)区别
-
std::make_pair("Bar", 12345)
比std::pair<std::string, int>("Bar", 12345)
因为std::string
type 是一个成熟的类,可以进行复制和操作"Bar"
只是一个字符串文字(因此只是一个指针副本);然而,因为最后你确实需要创建std::string
...这取决于编译器的质量
一般来说,我会推荐:
-
[]
用于更新
-
insert(std::make_pair())
用于忽略重复项
std::make_pair
不仅更短,而且还遵循 DRY 准则:不要重复自己。
但为了完整起见,最快(也是最简单)的是emplace http://en.cppreference.com/w/cpp/container/map/emplace(启用 C++11):
map.emplace("Bar", 12345);
它的行为是insert
,但它就地构造新元素。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)