reverse_iterator是否继承自迭代器?

时间:2012-05-27 22:32:59

标签: c++ stl iterator

让它为std::list::iteratorstd::list::reverse_iterator。反向派来自前锋吗?如果没有,那么为什么list

的成员函数没有相反的等价物

提前致谢。

2 个答案:

答案 0 :(得分:5)

  

让它成为std :: list :: iterator和std :: list :: reverse_iterator。反向来自前锋吗?

不一定,他们可能(并且可能在大多数实现中)不同类型。迭代器一直被复制,这种继承会导致切片。此外,iterator上的所有操作都应为virtual,以避免不一致,这样效率会很低。考虑到它,标准甚至禁止继承作为一种可能的实现(也许是间接的)。

更新:该标准提供了std::reverse_iterator类模板的定义,并强制要求std::list::reverse_iterator是此类模板的专门化。继承不是可能的实现。

  

如果没有,那么为什么列表的成员函数没有相反的等价物呢?

因为您可以在base()上致电reverse_iterator以获取基础常规iteratorreverse_iterator及其对应的iterator i之间的基本关系是&*(reverse_iterator(i)) == &*(i - 1).

答案 1 :(得分:1)

在GNU的C ++标准库实现中,reverse_iterator和迭代器之间存在一种关系。 (我从未查看过MSVC ++或llvm实现,但我认为它们是相同的。)

基本上,reverse_iterator接受一个迭代器并且有一个瘦包装器,因此++别名为 - 和 - 别名为++。基本上所有操作都是基础非反向迭代器的包装器。

  

如果没有,那么为什么列表的成员函数没有相反的等价物呢?

std::list确实有reverse iterator