gpt4 book ai didi

c++ - std::reverse_iterator 的缺点是什么?

转载 作者:IT老高 更新时间:2023-10-28 22:05:06 25 4
gpt4 key购买 nike

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

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

后续问题:

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

最佳答案

嗯,最大的问题是它们不是前向迭代器,而且有些东西几乎需要前向迭代器。因此,您必须进行一些有趣的转换才能使事情正常进行。列举一些问题

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

  2. base() 在插入方面返回与反向迭代器等效的正向迭代器。也就是说,在当前元素的前面插入插入。因此,如果 base() 为您提供了一个指向同一元素的迭代器,则反向迭代器指向的元素将是错误的元素。所以,它指向一个前方,你可以用它来插入。

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

  4. 你是否可以使用 base()erase() 来正确删除元素完全取决于你的实现。它适用于 gcc,但在 Visual Studio 中,它们实际上只是以某种方式包装前向迭代器,因此在处理反向迭代器和 Visual 时使用 erase() 不起作用工作室。我不记得 insert() 是否有同样的问题,但是反向迭代器在 C++ 的不同实现之间的工作方式不同(根据 Visual Studio 的家伙,标准不够清晰),因此除了简单地迭代容器之外,将它们用于任何事情都可能有点麻烦。

可能还有其他问题,但是在 C++ 中处理任何类型的迭代器(非 const 前向迭代器)时,除了简单地迭代容器之外,还可能会有点麻烦——如果你能做到的话这一切 - 因为有很多函数需要非常量前向迭代器而不是任何其他类型的迭代器。

如果您真的想了解各种迭代器类型之间的区别以及与之相关的问题,我建议您阅读 Scott Meyer 的Effective STL。它有一个关于迭代器的精彩章节。

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com