【问题标题】:Skipping iterator跳过迭代器
【发布时间】:2011-08-06 20:35:21
【问题描述】:

我有一个值序列,我想传递给一个接受(iterator begin, iterator end) 对的函数。但是,我只想处理原始序列中的每个第二个元素。

有没有一种使用 Standard-Lib/Boost 的好方法来创建允许我传入原始序列的迭代器外观?我认为像这样简单的东西已经在 boost 迭代器或范围库中,但我没有找到任何东西。

还是我错过了另一种完全明显的方法?当然,我知道我总是可以选择将值复制到另一个序列,但这不是我想要做的。

编辑:我知道filter_iterator,但它会过滤值 - 它不会改变迭代推进的方式。

【问题讨论】:

标签: c++ boost stl boost-iterators


【解决方案1】:

我想你想要boost::adaptors::strided

【讨论】:

    【解决方案2】:
    struct TrueOnEven {
     template< typename T >
     bool operator()(const T&) { return mCount++ % 2 == 0; }
     TrueOnEven() : mCount(0) {}
     private:
      int mCount;
    };
    
    int main() {
     std::vector< int > tVec, tOtherVec;
     ...
     typedef boost::filter_iterator< TrueOnEven, int > TakeEvenFilterType;
    
     std::copy( 
      TakeEvenFilterType(tVec.begin(), tVec.end()),
      TakeEvenFilterType(tVec.end(), tVec.end()),
      std::back_inserter(tOtherVec));
    }
    

    老实说,这不仅仅是美观和直观。我写了一个简单的“枚举器”库,包括惰性集成查询,以避免像上面这样的热点问题。它允许你写:

    Query::From(tVec.begin(), tVec.end())
    .Skip<2>()
    .ToStlSequence(std::back_inserter(tOtherVec));
    

    Skip&lt;2&gt; 基本上实例化了一个通用的“过滤器”,它跳过每第 N 个(在本例中为每秒)元素。

    【讨论】:

    • +1 表示认识到这只是一个愚蠢的 hack。它还对内部算法如何使用迭代器以及filter_iterator 如何使用谓词做出了许多假设。例如,如果 operator() 为给定的迭代器计算了两次,那么一切都会不同步。
    • 好吧,严格来说,如果 filter_iterator 分类为 std::input_iteratorboost::SinglePass 以外的任何其他内容。你可能应该写一个成熟的skipping_iterator,这比看起来更难......
    【解决方案3】:

    这是 Boost 的filter iterator。这正是你想要的。

    更新:对不起,读错了。以下是 Boost 中所有迭代器功能的列表:

    http://www.boost.org/doc/libs/1_46_1/libs/iterator/doc/#specialized-adaptors

    我认为你只需要一个带有重载 operator++ 的普通 iterator_adaptor,它会将底层迭代器值增加两次。

    【讨论】:

    • 不,不是。过滤器迭代器过滤带有值谓词的序列 - 但我想在迭代器上有一个谓词(如果你想把它看作是过滤的话)。基本上,我只想将+=2 作为++ 呈现给我的内部运营商
    • 问题是两次应用(在实现中)operator++ 可以越过容器结束,而不检查跳过的元素是否已经是 end() 迭代器。虽然我想到了一个 for 循环 for(skip_iterator it = v.begin() ; it != v.end() ; ++it){}
    • alfC:在第二次调用底层迭代器的operator++ 之前,您需要检查it != end 是否在operator++ 中。
    • @rubenvb,但要做到这一点,迭代器必须在内部了解end。您会将 end 作为迭代器的一部分,还是将其传递给 next (++) 函数?无论如何,这在迭代器的上下文中没有任何意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多