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/