我可以依靠std :: map :: operator []来触摸吗?

时间:2015-10-12 21:33:21

标签: c++ c++11 dictionary stl

我有一个C ++程序,其中我想为std::map中缺少的任何键插入默认值。我认为最简单的方法是使用std::map::operator[]()类似POSIX touch命令 - 也就是说,如果值已经存在则保持不变,但如果它不存在则创建它。吨。对于example

#include <map>
#include <vector>
#include <iostream>

using namespace std;

int main()
{
    vector<int> keys = {0, 1};

    map<int, int> m;
    m[1] = 5;
    m[2] = 12;

    for (const int i : keys)
    {
        m[i]; // touch value
    }

    for (auto const & kv : m)
    {
        cout << kv.first << ", " << kv.second << endl;
    }
}

我可以确定编译器不会优化m[i];语句,因为我没有&#34;做&#34;什么与他们? (未明确指定,不读取。)

3 个答案:

答案 0 :(得分:17)

是的,你可以肯定。优化调用将改变程序的可观察行为,并且不允许编译器执行此操作(除了RVO)。

这称为as-if rule

答案 1 :(得分:6)

是的,你可以肯定。当您考虑到相关的行与此相同时,它可能更直观:

m.operator[](i);

...如果他们做任何事情,你不希望任何函数调用在程序之外进行优化。

答案 2 :(得分:5)

如果你没有给它分配一些东西,那么[]运算符确实默认构造了该键所在位置的值。

Reference Link

  

如果k与容器中任何元素的键不匹配,则   function使用该键插入一个新元素并返回一个引用   到它的映射值。请注意,这总是会增加容器   即使没有为元素分配映射值,也将大小加1   element是使用其默认构造函数构造的。