最近,我在请求请求中看到了一个变化。我想知道是否有任何改善。

以下是简化版本。

...
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,它与emplaceinsert一样快。

关于c++ - std::map索引运算符与插入方法的性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58393795/

10-11 22:57
查看更多