Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将反向迭代器与作为代理的迭代器一起使用_C++_Iterator_Reverse Iterator - Fatal编程技术网

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中修复。