我想一步步将新元素插入unordered_map
中并更新它们的值(如果它们已经存在)。我正在使用operator[]
重载来执行此操作,文档说它会返回对映射值类型的引用。
unordered_map<int, size_t> map;
int &element = map[-3];
element++;
这不能编译。但是,以下代码确实可以执行,并按我的期望执行(将值初始化为1并在存在的情况下将其递增):
unordered_map<int, size_t> map;
map[-3]++;
以下内容也可以编译,但没有达到我的期望(这是我最初写的,导致出现错误):
unordered_map<int, size_t> map;
auto element = map[-3];
element++;
编译器似乎表明右值map[-3]
是int
,而不是int&
。
我看了这个答案:return value of map operator[] (and "at" method)
但是在那种情况下,LHS类型被强制为一个值。如何获得[可变]参考?
答案 0 :(得分:6)
您的地图的价值是什么? int或size_t吗?
unordered_map<int, size_t> map;
size_t &element = map[-3]; // now it works
element++;
auto
会在类型推导完成后丢弃引用,如果要修改map中的值,则需要使用decltype(auto)
或auto&
(更具可读性)
unordered_map<int, size_t> map;
decltype(auto) element = map[-3];
element++; // now it works