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

时间:2019-10-15 11:37:12

标签: c++ c++14 std compiler-optimization

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

以下是简化版本。

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

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

1 个答案:

答案 0 :(得分:3)

除非进行衡量,否则说出任何有关性能下降/提高的事情都是毫无意义的。当然,从理论上讲,第一个版本更快,但是只有通过测量才能证明相关理论的正确性。

说-我认为更改的要点是使逻辑明确-分配值或如果map中不存在值则插入。 'com.androidmapsextensions:android-maps-extensions:2.4.0'operator[]的使用是该语言最讨厌的怪癖之一。自C ++ 17起,有一种专用的方法-std::map,其速度与insert_or_assignemplace一样快。

相关问题