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

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

跟进问题:

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

最佳答案

好吧,最大的问题是它们不是转发迭代器,并且有些东西很期待转发迭代器。因此,您必须进行一些有趣的转换才能正常工作。列举一些问题

  • 某些erase()insert()版本需要迭代器而不是反向迭代器。这意味着,如果您正在使用反向迭代器,并且想要insert()erase(),则必须使用反向迭代器的base()函数来使用正向迭代器。没有自动转换。
  • base()在插入方面返回与反向迭代器等效的正向迭代器。即,将insert插入到当前元素的前面。因此,如果base()给您一个指向同一元素的迭代器,则反向迭代器指向的元素将是错误的指向元素。因此,它指向前,您可以将其用于插入。
  • 因为base()返回指向另一个元素的迭代器,所以erase()使用错误的元素。如果您从erase()在迭代器上调用了base(),则会从反向迭代器指向的元素中擦除容器中向前的一个元素,因此您必须在调用base()之前增加反向迭代器,才能获得正确的正向迭代器。用于erase()
  • 您是否甚至可以结合使用base()erase()来正确擦除元素,这完全取决于您的实现。它可以与gcc一起使用,但是对于Visual Studio,它们实际上只是以某种方式包装正向迭代器,以便在处理反向迭代器和Visual Studio时不使用erase()。我不记得insert()是否存在相同的问题,但是反向迭代器在C++的不同实现之间的作用不同(根据Visual Studio专家,该标准还不够清楚),因此它可能有点毛茸茸除了简单地遍历容器之外,还可以将它们用于其他任何用途。

  • 可能还存在其他问题,但是在C++中进行非简单的正向迭代器之外的任何类型的迭代器时,除了简单地对容器进行迭代之外,都可能会变得有些毛茸茸-如果您能做到的一切-因为如此多的函数需要非常量正向迭代器,而不是其他任何类型的迭代器。

    如果您真的想知道各种迭代器类型之间的区别以及与之相关的问题,建议阅读Scott Meyer的Effective STL。它有很多关于迭代器的章节。

    编辑:至于Boost的反向迭代器如何纠正这些缺点,恐怕我没有头绪。我知道一些标准反向迭代器的缺点,并且过去曾被它们咬过,但是我从来没有使用Boost太多,所以我完全不熟悉它们的反向迭代器。抱歉。

    关于c++ - std::reverse_iterator的缺点是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3207679/

    10-11 01:52