【问题标题】:Why there isn't lower_bound and upper_bound for unordered_multimap?为什么 unordered_multimap 没有 lower_bound 和 upper_bound?
【发布时间】:2019-03-18 12:53:35
【问题描述】:

从 multimap 切换到 unordered_multimap,我意识到没有等价物:

  • lower_bound
  • 上界

equal_range 似乎很明显可以简单地等效,但我想知道我是否遗漏了一些东西:选择的原因。

来自任何其他库,我会认为差异只是一个简单的错误,但 STL 在这方面通常是非常正交的。

【问题讨论】:

  • 这些对于未分类的容器有什么用处?
  • 顺便说一句,不确定“简单错误”是什么意思,但通常编译时错误比运行时错误好得多
  • 虽然 lower_bound 返回具有给定键的第一个迭代器,但这在无序容器上是可能的。似乎我错过了缺少关键的情况,其中顺序很重要。

标签: c++ stl


【解决方案1】:

名字里有。 无序_multimap。没有顺序,因此没有上下关系。存储在unordred_* 容器中的项目(键)甚至不需要实现</std::less,只需哈希和相等操作即可。

【讨论】:

    【解决方案2】:

    如果您查看std::lower_bound() 和std::upper_bound() 文档,您会发现它们对它们可以应用的范围提出了特殊要求:

    范围 [first, last) 必须根据表达式 !(value

    由于std::map 满足该标准,因此可以在其上使用那些通用函数,但这样的使用效率不高,因为这些通用函数不知道地图的内部表示。所以std::map 提供了它自己的、更高效的变体(虽然不那么通用)。另一方面,std::unordered_map 不满足标准,因此您无法在其上应用这些通用函数,因此为 std::unorderd_map 本身实现它们没有任何意义。

    虽然 lower_bound 返回具有给定键的第一个迭代器,但这在无序容器上是可能的。

    这就是std::find() 所做的。 std::lower_bound() 或 std::map::lower_bound() 为您提供位置,范围的元素不小于键。您可以使用它来查找特定元素这一事实是该行为的有用副作用,但不是这些功能的主要目的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-10
      • 2016-10-18
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多