【问题标题】:How can you use a reverse iterator with an iterator that is a proxy如何将反向迭代器与作为代理的迭代器一起使用
【发布时间】:2014-01-09 10:01:14
【问题描述】:

假设您有一个实际上是代理并包含它返回的数据的迭代器,您如何创建反向迭代器?

解引用运算符的std::reverse_iterator 实现创建一个临时对象,然后递减和解引用,代码如下:

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

结果它返回给你的是一个指向数据的指针,在你得到它之前就超出了范围。

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

你怎么能解决这个问题?

【问题讨论】:

  • 你的意思是你的迭代器拥有它应该返回的对象(它不是与代理相反)吗?
  • reverse_iterator 与“代理迭代器”一起使用是非法的,因为它需要一个双向迭代器,并且它们的operator* 必须返回一个T cv&
  • @nikitoz 我目前正在查看的迭代器被描述为“像代理一样”,所以是的,它可能不是代理。是的,取消引用返回了迭代器拥有的东西。
  • @Simple 迭代器是双向的,operator* 返回一个T cv &

标签: c++ iterator reverse-iterator


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    在标准中,deref_tmpreverse_iterator 的仅供展示的数据成员。

    【讨论】:

    • 我没有 C++03 标准的副本,但这可能是 C++11 中修复的缺陷。
    • C++03 有 Iterator tmp = current; return *--tmp; 的措辞,因此这符合 C++03 标准但错误,并在 C++11 中得到修复。
    猜你喜欢
    • 2010-10-27
    • 2022-10-07
    • 2019-08-09
    • 1970-01-01
    • 2020-11-06
    • 2013-05-30
    • 2012-02-03
    • 2018-09-23
    • 2020-01-21
    相关资源
    最近更新 更多