如何将反向迭代器与作为代理的迭代器一起使用



假设你有一个迭代器,它实际上是一个代理并包含它返回的数据,你怎么能做一个反向迭代器呢?

std::reverse_iterator 取消引用运算符的实现创建一个临时对象,然后它递减和取消引用,其代码如下所示:

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

结果是,它返回给您的是一个指向在您掌握它之前超出范围的数据的指针。

这产生了相当不幸的结果。

你怎么能解决这个问题?

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

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

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

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

注: 此操作必须使用辅助成员变量而不是临时变量,以避免返回在关联迭代器的生存期之后持续存在的引用。

在标准deref_tmp中是 reverse_iterator 的仅用于展示的数据成员。

最新更新