假设您有一个实际上是代理的迭代器并包含它返回的数据,那么如何制作反向迭代器呢?
解除引用运算符的std :: reverse_iterator实现创建一个临时对象,然后递减和解除引用,代码类似于:
reference operator*() const {
iterator tmp = current;
return *--tmp;
}
结果是它返回给你的是一个指向超出范围的数据的指针。
这是非常不幸的结果。
你怎么能绕过这个?
答案 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_tmp
是reverse_iterator
的for-exposition-only数据成员。