1

让它成为std::list::iteratorstd::list::reverse_iterator。反向是从正向派生的吗?如果不是,那么为什么没有成员函数的反向等价物list

提前致谢。

4

2 回答 2

5

让它成为 std::list::iterator 和 std::list::reverse_iterator。反向是从正向派生的吗?

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

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

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

因为你可以调用base()areverse_iterator来获取底层的正则iteratorreverse_iteratora与其对应的基本关系iterator i&*(reverse_iterator(i)) == &*(i - 1).

于 2012-05-27T22:38:43.127 回答
1

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

基本上,reverse_iterator 接受一个迭代器并具有一个薄包装器,以便 ++ 别名为 -- 和 -- 别名为 ++。基本上所有操作都是底层非反向迭代器的包装器。

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

std::list确实有一个反向迭代器

于 2012-05-27T22:44:19.603 回答