【问题标题】:why does unordered_map not have rbegin() or rend(), but only begin() and end()为什么unordered_map没有rbegin()和rend(),而只有begin()和end()
【发布时间】:2013-01-29 23:21:20
【问题描述】:

使用 begin()、end() 和前向迭代器迭代 unordered_map 似乎很奇怪。

如果是这样,为什么它也没有 rbegin()、rend() 和双向迭代器? 有什么技术原因吗?

【问题讨论】:

  • 从好的方面来说,您可以获得本地存储桶迭代器。这还不够吗?
  • 因为对于一个根本不需要的功能(如 juanchopanza 解释)。当然,这是个好问题。

标签: c++ c++11 iterator unordered-map


【解决方案1】:

它是无序的,所以迭代发生的顺序是(或应该是)不重要的。

【讨论】:

  • 如果顺序不重要,为什么会有 begin() & end() 迭代器?不要 begin() & end() 暗示有顺序?
  • @PhiloRobotist 我的猜测是它与其他标准库容器兼容。
【解决方案2】:

引用The C++ Standard Library

反向迭代器让算法通过切换 内部调用增量运算符到减量调用 运算符,反之亦然。所有具有双向迭代器的容器 或随机访问迭代器(所有序列容器,除了 forward_list 和所有关联容器)可以创建反向 迭代器通过它们的成员函数 rbegin() 和 rend()。从 C++11 开始, 返回只读迭代器的相应成员函数, 还提供了 crbegin() 和 crend()。

对于 forward_lists 和无序容器,没有向后迭代 提供了接口(rbegin()、rend() 等)。原因是 实现只需要单链表通过 元素。

【讨论】:

  • 标准版:23.5.4.1/1 类模板 unordered_map 概述:“unordered_map 类支持前向迭代器”。前向迭代器是不可逆的。
  • 为什么 unordered_map 有一个 begin(),因为它是无序的?
猜你喜欢
  • 1970-01-01
  • 2020-09-05
  • 2010-09-10
  • 2013-05-13
  • 2020-10-14
  • 1970-01-01
相关资源
最近更新 更多