为地图分配值的最有效方法

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,但它就地构造了新元素.