我有一个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;什么与他们? (未明确指定,不读取。)
答案 0 :(得分:17)
是的,你可以肯定。优化调用将改变程序的可观察行为,并且不允许编译器执行此操作(除了RVO)。
这称为as-if rule。
答案 1 :(得分:6)
是的,你可以肯定。当您考虑到相关的行与此相同时,它可能更直观:
m.operator[](i);
...如果他们做任何事情,你不希望任何函数调用在程序之外进行优化。
答案 2 :(得分:5)
如果你没有给它分配一些东西,那么[]运算符确实默认构造了该键所在位置的值。
如果k与容器中任何元素的键不匹配,则 function使用该键插入一个新元素并返回一个引用 到它的映射值。请注意,这总是会增加容器 即使没有为元素分配映射值,也将大小加1 element是使用其默认构造函数构造的。