获取对 unordered_map operator[] 返回值的引用
Posted
技术标签:
【中文标题】获取对 unordered_map operator[] 返回值的引用【英文标题】:Acquiring a reference to unordered_map operator[] return value 【发布时间】:2019-01-11 06:58:33 【问题描述】:我想在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 类型被强制为一个值。如何获取 [可变] 引用?
【问题讨论】:
试试auto& element = map[-3];
【参考方案1】:
你的地图有什么价值? 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
【讨论】:
当然你的意思是value
而不是key
;)
啊哈是的,值是size_t
!感谢decltype
的提示。虽然@Sailesh D 上面的评论可能更干净?
decltype(auto)
是不是有点矫枉过正? auto&
或 auto&&
也能正常工作,而且更容易理解
不确定礼仪,但如果你包括auto&
,我可以接受答案(?)
@JVApen 是的,感谢您的建议,我也在答案中添加了 auto&。以上是关于获取对 unordered_map operator[] 返回值的引用的主要内容,如果未能解决你的问题,请参考以下文章
如何从具有最高值的 unordered_map 中获取密钥?
unordered_map 似乎没有返回对 [] 运算符的引用