根据C ++ 17标准,为什么反向迭代器不是正式的迭代器类?

问题描述 投票:4回答:2

反向迭代器不在迭代器类别标记列表中,因此假定它不是类别。那究竟是什么?

c++ stl c++17
2个回答
18
投票

迭代器类别编码功能级别。

  • 输入迭代器是最小的底层 - 可递增和可解除引用一次
  • 前向迭代器是一个输入迭代器,您可以多次取消引用并具有多遍支持。
  • 双向迭代器是一个可以递减的前向迭代器
  • 随机访问迭代器是一个双向迭代器,你可以O(1)前进+/- n
  • 连续迭代器是一个随机访问迭代器,它引用连续的内存

这些功能级别由算法使用 - 一些算法需要一定程度的功能,一些算法可以根据某些功能级别进行简单优化(例如advance(it, n)用于随机访问迭代器可以只做it += n而对于前向迭代器它必须是++it in一个循环)。

但“逆转”并不是一个功能级别 - 它只是呈现基础数据的另一种方式。反向迭代器不值得它自己的迭代器类别,原因与“移动”迭代器没有或“过滤”迭代器没有或“计数”迭代器不相同。算法不关心迭代器是否反转 - 它们以相同的方式工作。 ++it实际上移动迭代器的方式并不重要。

反转迭代器只是迭代器。 std::reverse_iterator被称为迭代器适配器(以及其他一些,如std::move_iterator) - 它是一个迭代器,适应不同的迭代器。但是你可以编写一个不是适配器的反向迭代器 - 实际上,你甚至可以编写一个非双向的反向迭代器!这两个概念是正交的。


8
投票

所以假设它不是一个类别。

你的假设是正确的。反向迭代器不是迭代器的类别。

那究竟是什么?

标准将std::reverse_iterator定义为:

类模板reverse_iterator是一个迭代器适配器,它从其底层迭代器定义的序列的末尾迭代到该序列的开头。反向迭代器与其对应的迭代器之间的基本关系由身份建立:&(reverse_iterator(i))==&(i-1)。

std::reverse_iterator<Iterator>的迭代器类别是Iterator的迭代器类别。


类似地,其他迭代器适配器(如移动迭代器,过滤迭代器,跨越迭代器等)也不是迭代器类别。

© www.soinside.com 2019 - 2024. All rights reserved.