inq*_*uam 12 c++ dictionary stdmap std c++-standard-library
将值赋给地图的哪种方式最有效?或者它们都针对相同的代码进行了优化(在大多数现代编译器上)?
// 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));
Run Code Online (Sandbox Code Playgroud)
(我知道我可以进行基准测试并检查编译器输出,但是这个问题现在出现了,我手边的唯一一件事就是我的手机......呵呵)
Mat*_* M. 24
首先,[]和之间存在语义差异insert:
[]将替换旧值(如果有的话)insert将忽略新值(如果已存在旧值)因此,比较两者一般是没用的.
关于插入版本:
std::map<std::string, int>::value_type 是 std::pair<std::string const, int>如此3和4之间不存在(重要)差std::make_pair("Bar", 12345)是std::pair<std::string, int>("Bar", 12345)因为std::string类型是一个完整的类,在复制上有操作,而且"Bar"只是一个字符串文字(因此只是一个指针副本); 但是,因为最后你需要创建std::string...它将取决于你的编译器的质量一般来说,我会建议:
[] 用于更新insert(std::make_pair()) 忽略重复std::make_pair 不仅更短,它还尊重干燥指南:不要重复自己.
但是为了完整性,最快(也是最简单)将是emplace(启用C++ 11):
map.emplace("Bar", 12345);
Run Code Online (Sandbox Code Playgroud)
它的行为是insert,但它就地构造了新元素.