C++ 如何将反向迭代器与作为代理的迭代器一起使用
如果您有一个迭代器,它实际上是一个代理,并且包含它返回的数据,那么如何创建反向迭代器呢 解引用操作符的反向迭代器实现创建一个临时对象,然后对其进行递减和解引用,代码如下:C++ 如何将反向迭代器与作为代理的迭代器一起使用,c++,iterator,reverse-iterator,C++,Iterator,Reverse Iterator,如果您有一个迭代器,它实际上是一个代理,并且包含它返回的数据,那么如何创建反向迭代器呢 解引用操作符的反向迭代器实现创建一个临时对象,然后对其进行递减和解引用,代码如下: reference operator*() const { iterator tmp = current; return *--tmp; } 结果是,它返回给您的是一个指针,指向在您获得数据之前超出范围的数据 这有相当不幸的结果 如何解决这个问题?看起来您需要为这种特定情况编写自己的自定义反向迭代器实
reference operator*() const {
iterator tmp = current;
return *--tmp;
}
结果是,它返回给您的是一个指针,指向在您获得数据之前超出范围的数据
这有相当不幸的结果
如何解决这个问题?看起来您需要为这种特定情况编写自己的自定义反向迭代器实现,因为您的迭代器类型与反向迭代器的这种特定实现不兼容
根据,一些实现也存储迭代器的递减副本,但不是全部。Boost::reverse\u迭代器似乎没有存储额外的副本。我认为标准库实现不正确。如果您查看C++11标准中的24.5.1.3.4[reverse.iter.op.star],您会发现以下内容:
deref_tmp = current;
--deref_tmp;
return *deref_tmp;
注意:此操作必须使用辅助成员变量而不是临时变量,以避免返回在关联迭代器的生存期之后仍然存在的引用
在标准的
deref_tmp
是reverse_iterator
的仅供公开的数据成员,您的意思是您的迭代器拥有它应该返回的对象(它不是与代理相反吗)?将reverse_iterator
与“代理迭代器”一起使用是非法的,因为它需要一个双向迭代器,他们的操作符*
必须返回一个tcv&
@nikitoz迭代器,我现在看到的迭代器被描述为“像一个代理”,所以是的,它可能不是一个代理。是的,取消引用返回迭代器拥有的内容。@简单迭代器是双向的,操作符*
返回tcv&
我没有C++03标准的副本,但这可能是C++11中修复的缺陷。C++03的措辞是迭代器tmp=current;返回*——tmp代码>因此,这是符合C++03标准的,但错误的,并在C++11中修复。