反向迭代器不在迭代器类别标记列表中,因此假定它不是类别。那究竟是什么?
迭代器类别编码功能级别。
n
这些功能级别由算法使用 - 一些算法需要一定程度的功能,一些算法可以根据某些功能级别进行简单优化(例如advance(it, n)
用于随机访问迭代器可以只做it += n
而对于前向迭代器它必须是++it
in一个循环)。
但“逆转”并不是一个功能级别 - 它只是呈现基础数据的另一种方式。反向迭代器不值得它自己的迭代器类别,原因与“移动”迭代器没有或“过滤”迭代器没有或“计数”迭代器不相同。算法不关心迭代器是否反转 - 它们以相同的方式工作。 ++it
实际上移动迭代器的方式并不重要。
反转迭代器只是迭代器。 std::reverse_iterator
被称为迭代器适配器(以及其他一些,如std::move_iterator
) - 它是一个迭代器,适应不同的迭代器。但是你可以编写一个不是适配器的反向迭代器 - 实际上,你甚至可以编写一个非双向的反向迭代器!这两个概念是正交的。
所以假设它不是一个类别。
你的假设是正确的。反向迭代器不是迭代器的类别。
那究竟是什么?
标准将std::reverse_iterator
定义为:
类模板reverse_iterator是一个迭代器适配器,它从其底层迭代器定义的序列的末尾迭代到该序列的开头。反向迭代器与其对应的迭代器之间的基本关系由身份建立:&(reverse_iterator(i))==&(i-1)。
std::reverse_iterator<Iterator>
的迭代器类别是Iterator
的迭代器类别。
类似地,其他迭代器适配器(如移动迭代器,过滤迭代器,跨越迭代器等)也不是迭代器类别。