可以依赖std::map::operator[]来触摸吗?
Can I rely on std::map::operator[] to touch?
我有一个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计算元素使用默认构造函数构造)。
相关文章:
- 为什么 std::optional::operator=(U&&) 要求你是非标量类型?
- 'operator='已弃用:改用 QDir::setPath()
- 过载'operator new'如何导致无限循环?
- 与'operator='不匹配(操作数类型'String'且"void")
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 处理"no operator found"
- 如何编写 operator= 用于使用虚拟方法与非平凡成员的匿名联合
- 运算符重载:"operator+"必须采用零个或一个参数
- 使用 operator() 扩展 Eigen::EigenBase
- 错误消息:使用"string* +="后"no match for 'operator+='"
- 有没有办法修改'operator->',以便'z->im'返回复数的虚部
- "operator +="行为异常的定义
- 检测 OpenCV C++窗口上的触摸
- C++ "error: use of overloaded operator '*' is ambiguous"似乎只有一场比赛
- 错误:二进制'operator*' 'float'和'float[0]'类型的操作数无效
- 在 Eclipse: "error: no match for 'operator='" 中获取错误消息
- 为什么 operator() 处的指针成员不起作用?
- 为什么 string_view::operator== 按值接受参数
- "operator()"在重载运算符方法中是什么意思,在priority_queue(STL)中用作C++中的比较器?
- 可以依赖std::map::operator[]来触摸吗?