【问题标题】:Reason for restrictions of `reverse_iterator``reverse_iterator` 限制的原因
【发布时间】:2018-06-13 22:12:21
【问题描述】:

the cppreference page of reverse_iterator我发现以下评论

std::reverse_iterator 不适用于返回引用的迭代器 成员对象(所谓的“存储迭代器”)。存储示例 迭代器是std::filesystem::path::iterator

这种说法正确吗?如果是,那是为什么?

对我来说,这个限制没有意义,因为我假设反向迭代器基本上交换了 operator ++operator --(并将底层迭代器存储了一个)。

编辑:显然这个问题可能会被误解: 我知道我们需要一次减量操作来实现反向迭代器。问题是为什么在reverse_iterator 的构建过程中没有实现这一点。然后避免了存储迭代器的问题。但显然这不是这样做的,每次取消引用迭代器时都会进行递减。为什么?

【问题讨论】:

标签: c++ stl iterator


【解决方案1】:

并将底层迭代器存储一倍

这就是原因。您必须在取消引用时变出一个非非一的迭代器,如果破坏该变出的迭代器会使从它获得的引用无效(如在存储迭代器的情况下),那么鼻恶魔。

【讨论】:

  • 好的,我明白误会了。当我写stored off-by-one 时,我的意思是在reverse_iterator 的构建过程中,底层迭代器需要递减。我知道我们需要在某个时候递减来实现反向迭代器,但我认为它可以在构建期间完成一次。那么你提到的问题就避免了。显然这不是它的完成方式。那么为什么不能使用构建期间递减迭代器方法呢?抱歉,如果问题在这方面不清楚。
  • @AndreasH。因为您获得的迭代器可能不可递减。考虑rend(),它是从begin() 构造的。
  • :所以你说`begin()`给出了一个不可递减的迭代器?
  • @AndreasH。根据定义,begin() 为容器的开头提供了一个迭代器,该位置“之前”没有任何内容。
猜你喜欢
  • 2015-02-27
  • 2014-12-25
  • 2011-02-26
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多