3

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

解引用运算符的 std::reverse_iterator 实现创建一个临时对象,然后它会递减和取消引用,代码类似于:

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

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

这带来了相当不幸的结果。

你怎么能绕过这个?

4

2 回答 2

1

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

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

于 2014-01-09T10:22:58.897 回答
1

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

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

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

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

于 2014-01-09T10:28:17.093 回答