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

Performance of std::map index operator vs insert method

我最近看到拉取请求中的更改。我想知道这是否有任何改善。

以下为简化版。

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

如果我的理解有误,谁能澄清一下?

除非经过衡量,否则谈论性能 lose/gains 是毫无意义的。当然,第一个版本在理论上更快,但只有测量才能显示相关理论的相关性。

也就是说 - 在我看来,更改的重点是使逻辑明确 - 如果地图中不存在值,则分配值或插入。 operator[]std::map 的用法是该语言最讨厌的怪癖之一。由于 C++17 有专门的方法 - insert_or_assignemplaceinsert.

一样快