【问题标题】:Skip an entry of a random iterator跳过随机迭代器的条目
【发布时间】:2014-05-20 18:03:46
【问题描述】:

假设我们有一个函数foo 来做一些事情*firsta*lastb之间的所有元素:

foo(RandomAccessIterator1 firsta,RandomAccessIterator1 lasta){
    for (RandomAccessIterator1 it=firsta;it!=lasta+1;it++){
            //here stuff happens...
    }    
}

问题 a):有没有办法只跳过索引 firsta<i<lastb 将输入修改为foo --e.g.随机迭代器, 换句话说,不改变foo 本身,只改变它的输入?

--不幸的是我想跳过的索引不在边缘 (它们通常位于firstalasta 之间)和foo 是一种复杂的分治算法,不适合 在原始数组的子集上调用迭代器 正在指向。

问题 b):如果可以进行 a),那么这样做的成本是多少? 常量还是取决于(lasta-firsta)

【问题讨论】:

    标签: c++ iterator


    【解决方案1】:

    最好的方法是使用知道如何跳过该元素的迭代器。不过,一个更通用的想法是一个迭代器,它简单地迭代引擎盖下的两个单独的范围。我不知道 boost 中有什么可以做到这一点的,所以,这是我刚刚兴起的一个:http://coliru.stacked-crooked.com/a/588afa2a353942fc

    不幸的是,检测要跳过哪个元素的代码为每个迭代器增量增加了极少的开销,因此开销在技术上与lasta-firsta 成正比。实际上,在vector::iteratorchar* 周围使用此包装器应该使其性能水平与std::deque::iterator 大致相同,因此这不会是一个重大的减速。

    【讨论】:

    • 我刚刚想到 boost::filter_iterator 可能已经被使用,尽管开销是多少不太明显。
    • 谢谢老爷...我试试这个~反正比我复杂多了!
    • @user189035:好吧,请注意,您可以将迭代器本身复制粘贴到标题中,然后您只需使用auto range = concatenate_ranges(...) 位即可。这很复杂,因为这个版本非常灵活。它不只是跳过一个元素,它可以做任意数量的事情。例如“连接”几个结构。
    • @MooingDuck:谢谢:我使用你的结构越多,我就越觉得它健壮和优雅......
    • @user189035:我一直在考虑如何将其扩展为连接多个范围和/或不同的迭代器类型,但事实证明这些很棘手
    【解决方案2】:

    答案可能有点挑剔,但你可以调用foo(firsta,i-1)foo(i+1,lastb) 或类似的东西来达到预期的效果。

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      相关资源
      最近更新 更多