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

12
使用begin()、end()和前向迭代器来遍历unordered_map看起来很奇怪。如果是这样,为什么它没有rbegin()、rend()和双向迭代器呢?是否有技术上的原因?

3
在积极的一面,您可以获得本地桶迭代器。这难道不弥补了它的缺点吗? - Kerrek SB
因为这会对单个元素的存储需求产生过重的影响(就像billz所解释的那样),而这个特性并不是必要的(就像juanchopanza所解释的那样)。但这当然是一个好问题。 - Christian Rau
2个回答

23

这是一个无序的数据结构,所以遍历的顺序(或应该是)不重要。


1
如果顺序无关紧要,为什么还需要begin()和end()迭代器?难道begin()和end()不意味着有顺序吗? - PhiloRobotist
@PhiloRobotist 我猜测这是为了与其他标准库容器兼容。 - juanchopanza

11

摘自The C++ Standard Library

反向迭代器通过将增量运算符的调用内部转换为减量运算符的调用,以及反之,使算法能够向后执行。所有具有双向迭代器或随机访问迭代器的容器(所有序列容器,除了forward_list 和所有关联容器)都可以通过它们的成员函数 rbegin() 和 rend() 创建反向迭代器。自C ++11以来,还提供了相应的返回只读迭代器的成员函数 crbegin() 和 crend()。

对于 forward_list 和无序容器,没有提供反向迭代界面(rbegin(),rend()等)。原因是实现只需要单向链表遍历元素即可。


1
在标准库中:23.5.4.1/1 类模板 unordered_map 概述:“unordered_map 类支持前向迭代器”。前向迭代器不可逆。 - Michael Burr
2
为什么unordered_map有begin()函数,既然它是无序的? - choxsword

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接