std :: reverse_iterator的缺点是什么?

时间:2010-07-08 20:25:07

标签: c++ boost stl iterator

boost specialized iterator adaptors的文档指出boost::reverse_iterator“纠正了C ++ 98的std :: reverse_iterator的许多缺点。”

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

后续问题:

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

1 个答案:

答案 0 :(得分:11)

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

  1. 某些版本的erase()insert()需要迭代器而不是反转迭代器。这意味着如果你使用反向迭代器而你想要insert()erase(),那么你将不得不使用反向迭代器的base()函数来实现前进迭代器。没有自动转换。

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

  3. 因为base()返回指向不同元素的迭代器,所以它是用于erase()的错误元素。如果你从erase()调用迭代器上的base(),你就会从反向迭代器所指向的元素中删除容器中的一个元素,所以你必须在调用{{{}之前增加反向迭代器。 1}}以获取用于base()的正确的前向迭代器。

  4. 您是否可以使用erase()base()来正确删除元素,完全取决于您的实现。它适用于gcc,但是使用Visual Studio时,它们实际上只是以一种方式包装一个前向迭代器,以便在处理反向迭代器和Visual Studio时不能使用erase()。我不记得erase()是否有同样的问题,但反向迭代器在C ++的不同实现之间不起作用(根据Visual Studio人员,标准不够清晰),所以它可以除了简单地迭代容器之外,还可以将它们用于任何其他任何东西。

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

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

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