为啥`std::unordered_map::erase(key_type const&)`返回删除元素的数量?

Posted

技术标签:

【中文标题】为啥`std::unordered_map::erase(key_type const&)`返回删除元素的数量?【英文标题】:Why `std::unordered_map::erase(key_type const&)` return number of removed elements?为什么`std::unordered_map::erase(key_type const&)`返回删除元素的数量? 【发布时间】:2021-02-08 18:23:19 【问题描述】:

最近去使用std::unordered_map::erase,发现函数有一些重载:

Link to cppreferences
iterator erase( const_iterator pos );                         (1)  (since C++11)
iterator erase( iterator pos );                               (1)  (since C++17)
iterator erase( const_iterator first, const_iterator last );  (2)  (since C++11)
size_type erase( const key_type& key );                       (3)  (since C++11)

并且在函数返回值的描述中提到:

Return value
1-2) Iterator following the last removed element.
3) Number of elements removed.

最后一个 (3),表示我们可以拥有已移除元素的数量。这是否意味着地图上可以有相同的键?

【问题讨论】:

另见:en.cppreference.com/w/cpp/container/unordered_multimap/erase @MooingDuck 一个多图肯定可以有多个等效键。 确实(和这个问题的答案有关) @Ghasem Ramezani 表示有 unordered_multimap 有类似的功能。所以他们的行为是相同的。 【参考方案1】:

因为还有unordered_multimap,其中几个元素可以有相同的键。返回已擦除元素的数量对于 multimap、multiset、unordered_multimap 和 unordered_multiset 非常有意义。为非多容器返回元素数量而不仅仅是 bool 是一种使地图和多地图(等)的公共“界面”尽可能接近的方法,以便在某些情况下两者都可以通过模板参数使用。 擦除非多重映射或集合(或 unordered_map 或 unordered_set)确实只会返回 0 或 1。

【讨论】:

以上是关于为啥`std::unordered_map::erase(key_type const&)`返回删除元素的数量?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?