c++之map赋值
对map赋值有下面4种方法:
// 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));
stack overflow上大神是这样分析的:
First, there are semantic differences between []
and insert
:
[]
will replace the old value (if any)insert
will ignore the new value (if an old value is already present)
therefore comparing the two is useless in general.
Regarding the inserts versions:
std::map<std::string, int>::value_type
isstd::pair<std::string const, int>
so no (important) difference between 3 and 4std::make_pair("Bar", 12345)
is cheaper thanstd::pair<std::string, int>("Bar", 12345)
because thestd::string
type is a full fledged class with operations to do on copy and"Bar"
is just a string literal (thus just a pointer copy); however since at the end you do need to create thestd::string
... it will depend on the quality of your compiler
In general, I would recommend:
[]
for updatinginsert(std::make_pair())
for ignoring duplicates
std::make_pair
is not only shorter, it also respects the DRY guideline: Don't Repeat Yourself.
For completeness though, the fastest (and easiest) would be emplace
(C++11 enabled):
map.emplace("Bar", 12345);
Its behavior is that of insert
, but it constructs the new element in-place.
- 参考:
https://stackoverflow.com/questions/14218042/most-efficient-way-to-assign-values-to-maps