最近,我在请求请求中看到了一个变化。我想知道是否有任何改善。
以下是简化版本。
...
std::map<int, std::string> myMap;
... // map will get updated
void foo(int key, std::string value)
{
myMap[key] = value; // <-- this line gets changed
}
标记的单行更改如下。
auto entry = myMap.find(key);
if (entry == myMap.end())
{
myMap.insert(std::make_pair(key, value));
}
else
{
entry->second = value;
}
如果不存在
key
(这似乎是有效的观点),也许目的是避免创建对象。但是在insert()
调用中没有创建类似的临时对象吗?还是在这里进行某种优化?我认为,两个版本应具有相同的性能。但是,如果使用
emplace()
而不是insert()
将会有所改善。如果我的理解是错误的,有人可以澄清一下吗?
最佳答案
除非进行衡量,否则说出任何有关性能下降/增益的事情都是毫无意义的。当然,从理论上讲,第一个版本更快,但是只有通过测量才能证明相关理论的实用性。
这样说-我认为更改的重点是使逻辑明确-分配值或如果map中不存在值则插入。将operator[]
与std::map
结合使用是该语言最讨厌的怪癖之一。从C++ 17开始,有一种专用于此的方法-insert_or_assign
,它与emplace
或insert
一样快。
关于c++ - std::map索引运算符与插入方法的性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58393795/