如何将反向迭代器与作为代理的迭代器一起使用
How can you use a reverse iterator with an iterator that is a proxy
假设你有一个迭代器,它实际上是一个代理并包含它返回的数据,你怎么能做一个反向迭代器呢?
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
的仅用于展示的数据成员。
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器
- 不明白迭代器,引用和指针失效,一个例子
- 我可以使用反向迭代器作为ForwardIt吗
- ESP8266单片机矢量迭代器的C++问题
- 对于代理容器上的迭代器来说,"least bad implementation"可能是什么?
- 根据 boost::iterator_facade 定义基于代理的输出迭代器
- Gnu 的 <Iterator>reverse_iterator::运算符>和代理迭代器
- 如何将反向迭代器与作为代理的迭代器一起使用
- 具有代理迭代器/引用和auto的容器