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

Can I rely on std::map::operator[] to touch?

本文关键字:触摸 operator 依赖 std map      更新时间:2023-10-16

我有一个c++程序,我想在其中插入std::map中缺失的任何键的默认值。我认为这样做的最简单的方法是使用std::map::operator[]()像POSIX触摸命令-也就是说,如果它已经存在,则保持值不变,但如果它不存在,则创建它。例如,

#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];语句,因为我没有"做"任何事情与他们?

你可以确定。优化调用会改变程序的可观察行为,编译器不允许这样做(除了RVO的情况)。

是的,你可以确定。如果您认为所讨论的行相当于以下内容,可能会更直观:

m.operator[](i);

& help;你不期望任意函数调用被优化出你的程序,如果他们做任何事情。

[]操作符确实默认构造了键所在位置的值,如果你不给它赋值的话。

参考链接

如果k不匹配容器中任何元素的键值,则函数用该键插入一个新元素并返回一个引用到它的映射值。注意,这总是增加容器即使没有将映射值赋给元素(元素),大小也按1计算元素使用默认构造函数构造)。