C++ std::reverse_迭代器的缺点是什么?
boost的文档声明,C++ std::reverse_迭代器的缺点是什么?,c++,boost,stl,iterator,C++,Boost,Stl,Iterator,boost的文档声明,boost::reverse_迭代器“纠正了C++98的std::reverse_迭代器的许多缺点。” 这些缺点是什么?我似乎找不到对这些缺点的描述 后续问题: boost::reverse_iterator是如何纠正这些缺点的?好吧,最大的问题是它们不是前向迭代器,有些东西非常需要前向迭代器。所以,你必须做一些有趣的转换才能让事情顺利进行。列举一些问题 某些版本的erase()和insert()需要迭代器,而不是反向迭代器。这意味着,如果使用反向迭代器,并且希望inser
boost::reverse_迭代器
“纠正了C++98的std::reverse_迭代器的许多缺点。”
这些缺点是什么?我似乎找不到对这些缺点的描述
后续问题:
boost::reverse_iterator是如何纠正这些缺点的?好吧,最大的问题是它们不是前向迭代器,有些东西非常需要前向迭代器。所以,你必须做一些有趣的转换才能让事情顺利进行。列举一些问题
erase()
和insert()
需要迭代器,而不是反向迭代器。这意味着,如果使用反向迭代器,并且希望insert()
或erase()
,则必须使用反向迭代器的base()
函数来获得正向迭代器。没有自动转换base()
返回在插入方面与反向迭代器等效的正向迭代器。也就是说,在当前元素前面插入insert。因此,如果base()
为您提供了指向同一元素的迭代器,则反向迭代器指向的元素将是错误的元素。因此,它指向一个前方,您可以使用它进行插入base()
返回指向不同元素的迭代器,因此erase()
使用的元素不正确。如果您从base()
在迭代器上调用erase()
,您将从反向迭代器指向的元素中向前擦除容器中的一个元素,因此您必须在调用base()
之前递增反向迭代器,以便获得用于erase()
的正确正向迭代器base()
与erase()
一起使用来正确擦除元素,这完全取决于您的实现。它适用于gcc,但对于Visual Studio,它们实际上只是以一种方式包装了一个正向迭代器,使得在处理反向迭代器和Visual Studio时使用erase()
不起作用。我不记得<代码>插入()>代码>是否有相同的问题,但是反向迭代器在C++的不同实现之间不起作用(根据VisualStudio的家伙,标准不够清楚),所以除了简单地迭代容器之外,使用它们可能有点毛病。编辑:至于Boost的反向迭代器如何纠正这些缺点,我恐怕没有任何线索。我知道标准反向迭代器的一些缺点,过去也曾被它们所诟病,但我从来没有太多地使用过Boost,所以我对它们的反向迭代器一点也不熟悉。抱歉。这通常有点……不成熟。我只是猜测一下,作为评论发布:
std::reverse_iterator
的早期实现有时会有bug。Boost可能只是试图避开这种情况。也许评论更多的是关于reverse\u iterator
实现中的缺点,而不是标准中的缺点?我不确定我是否明白您的意思。“期望”前向迭代器的代码不应该“注意”任何差异,除非它们使用未定义的行为进行操作…C++03中的std::reverse_迭代器
模板公开了与基础迭代器相同的迭代器类别,它必须至少是一个双向迭代器,所以一个反向迭代器总是至少是一个bi di迭代器(因此也是一个正向迭代器)。我不相信你在这里是正确的。我相信反向迭代器实际上是正向迭代器。至少我看不出它在哪里违反了这个概念。对于boost::reverse_iterator
,您描述的问题中哪些是“已解决”的,哪些是不同的?从boost::reverse_iterator
文档中可以看出,base()
(和operator*()
)的行为与std::reverse_iterator
的行为相同。请查看我的后续问题。