std::map 索引运算符与插入方法的性能

Performance of std::map index operator vs insert method

本文关键字:方法 性能 插入 运算符 map 索引 std      更新时间:2023-10-16

我最近看到一个拉取请求发生了变化。我想知道这是否有任何改进。

以下是简化版本。

...
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(),将会有所改善。

如果我的理解是错误的,有人可以澄清这一点吗?

除非经过衡量,否则谈论性能损失/收益的任何事情都是毫无意义的。当然,第一个版本在理论上更快,但只有测量才能显示理论的相关性。

说 - 在我看来,更改的重点是使逻辑明确 - 如果地图中不存在值,则分配值或插入。将operator[]std::map一起使用是该语言中更令人讨厌的怪癖之一。自 C++17 以来,有专门的方法 -insert_or_assign它的速度与emplaceinsert一样快。