获取对 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&amp;

我看了一下这个答案:return value of map operator[] (and "at" method)

但在这种情况下,LHS 类型被强制为一个值。如何获取 [可变] 引用?

【问题讨论】:

试试auto&amp; 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&amp;(更易读)

   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&amp;auto&amp;&amp; 也能正常工作,而且更容易理解 不确定礼仪,但如果你包括auto&amp;,我可以接受答案(?) @JVApen 是的,感谢您的建议,我也在答案中添加了 auto&。

以上是关于获取对 unordered_map operator[] 返回值的引用的主要内容,如果未能解决你的问题,请参考以下文章

迭代 unordered_map 时如何获取指向键的指针?

如何从具有最高值的 unordered_map 中获取密钥?

unordered_map 似乎没有返回对 [] 运算符的引用

如何在c ++中遍历unordered_map的unordered_map的unordered_map

如何获得随机元素提升 unordered_map?

unordered map 和map的区别