我想unordered_map在一个步骤中插入新元素并更新它们的值(如果它们已经存在).我正在使用operator[]重载执行此操作,文档说这将返回对地图的值类型的引用.
unordered_map<int, size_t> map;
int &element = map[-3];
element++;
Run Code Online (Sandbox Code Playgroud)
这不编译.但是,以下操作会按照我的预期执行(将值初始化为1并在存在时将其递增):
unordered_map<int, size_t> map;
map[-3]++;
Run Code Online (Sandbox Code Playgroud)
以下也编译,但没有做我期望的(这是我最初写的,这导致了一个错误):
unordered_map<int, size_t> map;
auto element = map[-3];
element++;
Run Code Online (Sandbox Code Playgroud)
编译器似乎表明rvalue map[-3]是一个int,而不是一个int&.
我看了看这个答案:map operator []的返回值(以及"at"方法)
但在这种情况下,LHS类型被强制为一个值.我如何获得[可变]参考?
你的地图有什么价值?int还是size_t?
unordered_map<int, size_t> map;
size_t &element = map[-3]; // now it works
element++;
Run Code Online (Sandbox Code Playgroud)
auto在完成类型推导时丢弃引用,如果要修改map中的值,则需要使用decltype(auto)或auto&(更可读)
unordered_map<int, size_t> map;
decltype(auto) element = map[-3];
element++; // now it works
Run Code Online (Sandbox Code Playgroud)