如何使用带有代理的迭代器的反向迭代器

时间:2014-01-09 10:01:15

标签: c++ iterator reverse-iterator

假设您有一个实际上是代理的迭代器并包含它返回的数据,那么如何制作反向迭代器呢?

解除引用运算符的

std :: reverse_iterator实现创建一个临时对象,然后递减和解除引用,代码类似于:

  reference operator*() const {
    iterator tmp = current;
    return *--tmp;
  }

结果是它返回给你的是一个指向超出范围的数据的指针。

这是非常不幸的结果。

你怎么能绕过这个?

2 个答案:

答案 0 :(得分:1)

看起来您需要为此特定情况编写自己的自定义反向迭代器实现,因为您的迭代器类型与此特定的reverse_iterator实现不兼容。

根据http://en.cppreference.com/w/cpp/iterator/reverse_iterator,一些实现还会存储迭代器的递减副本,但不是全部。 Boost :: reverse_iterator似乎不存储额外的副本。

答案 1 :(得分:1)

我认为标准库实现不正确。如果你看一下C ++ 11标准中的24.5.1.3.4 [reverse.iter.op.star],你会发现以下内容:

deref_tmp = current;
--deref_tmp;
return *deref_tmp;
  

注意:此操作必须使用辅助成员变量而不是临时变量,以避免返回超出相关迭代器生命周期的引用。

标准deref_tmpreverse_iterator的for-exposition-only数据成员。