为什么unordered_map没有 rbegin() 或 rend(),而只有 begin() 和 end()

why does unordered_map not have rbegin() or rend(), but only begin() and end()

提问人: 提问时间:1/30/2013 最后编辑:templatetypedef 更新时间:1/30/2013 访问量:6208

问:

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

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

C++ C++11 迭代器 无序映射

评论

3赞 Kerrek SB 1/30/2013
从好的方面来说,您可以获得本地存储桶迭代器。这难道不能弥补吗?
0赞 Christian Rau 1/30/2013
因为这会对单个元素的存储要求产生太大的影响(如 billz 解释),而根本不需要的功能(如 juanchopanza 解释)。但当然是好问题。

答:

23赞 juanchopanza 1/30/2013 #1

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

评论

1赞 PhiloRobotist 2/7/2022
如果顺序不重要,为什么会有 begin() 和 end() 迭代器?begin() & end() 不暗示有秩序吗?
0赞 juanchopanza 2/7/2022
@PhiloRobotist我的猜测是,它将与其他标准库容器兼容。
11赞 billz 1/30/2013 #2

引自The C++ Standard Library

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

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

评论

1赞 Michael Burr 1/30/2013
在标准中:23.5.4.1/1 类模板unordered_map概述:“unordered_map类支持前向迭代器”。前向迭代器是不可逆的。
2赞 choxsword 2/27/2018
为什么unordered_map有一个 begin(),因为它是无序的?