std :: reverse_iterator的缺点是什么?

Emi*_*ier 18 c++ boost iterator stl

boost的专用迭代器适配器的文档声明boost::reverse_iterator"纠正了C++ 98的std :: reverse_iterator的许多缺点."

这些缺点是什么?我似乎无法找到这些缺点的描述.

后续问题:

boost :: reverse_iterator如何纠正这些缺点?

Jon*_*vis 11

好吧,最大的问题是它们不是前向迭代器,并且有些东西非常期待前向迭代器.所以,你必须做一些有趣的转换才能让事情发挥作用.列举一些问题

  1. 某些版本的erase()并且insert()需要迭代器而不是反转迭代器.这意味着如果你正在使用反向迭代器并且你想要insert()或者erase(),你将不得不使用反向迭代器的base()函数来获得前向迭代器.没有自动转换.

  2. base()在插入方面返回等价于反向迭代器的前向迭代器.也就是说,在当前元素的前面插入插入.因此,如果base()给出一个指向同一元素的迭代器,那么反向迭代器所指向的元素将是指向的错误元素.因此,它指向一个前进,您可以使用它进行插入.

  3. 因为base()返回指向不同元素的迭代器,所以它是用于的错误元素erase().如果erase()从中调用了迭代器base(),则从反向迭代器指向的元素中删除容器中的一个元素,因此在调用之前必须递增反向迭代器base(),以便获得正确的前向迭代器erase().

  4. 无论您甚至可以使用base()erase()正确擦除元素完全取决于您的实现.它适用于gcc,但是使用Visual Studio,它们实际上只是以一种方式包装一个前向迭代器,这样它erase()在处理反向迭代器和Visual Studio时就无法使用它.我不记得是否insert()有相同的问题,但反向迭代器在C++的不同实现之间不起作用(根据Visual Studio人员,标准不够清晰),所以它可能有点毛茸茸除了简单地迭代容器之外,还可以使用它们.

可能还有其他问题,但是除了简单地迭代容器之外,在C++中处理除了非const,forward迭代器之外的任何类型的迭代器都会有点毛茸茸 - 如果你甚至可以做到这一点 - 因为这么多函数需要非const前向迭代器而不是任何其他类型的迭代器.

如果您真的想知道各种迭代器类型之间的差异以及与它们相关的问题,我建议您阅读Scott Meyer的Effective STL.它有一个关于迭代器的伟大章节.

编辑:至于Boost的反向迭代器如何纠正这些缺点,我担心我没有线索.我知道一些标准的反向迭代器的缺点,过去曾被它们咬过,但我从未使用过很多Boost,所以我根本不熟悉它们的反向迭代器.抱歉.

  • 对于`boost :: reverse_iterator`,您所描述的哪些问题已"解决"或不同?据我所知,从`boost :: reverse_iterator`文档中,`base()`(和`operator*()`)的行为与`std :: reverse_iterator`的行为相同. (3认同)