跳过随机迭代器的条目

时间:2014-05-20 18:03:46

标签: c++ iterator

假设我们有一个函数foo来执行某事 *firsta*lastb之间的所有元素:

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

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

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

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

2 个答案:

答案 0 :(得分:3)

执行此操作的最佳方法是使用知道如何跳过该元素的迭代器。然而,一个更普遍的想法是迭代器,它简单地遍历两个不同的范围。我不知道有什么事情可以做到这一点,所以,这是我刚刚掀起的一个:http://coliru.stacked-crooked.com/a/588afa2a353942fc

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

答案 1 :(得分:1)

答案可能有点挑剔,但您可以拨打foo(firsta,i-1)foo(i+1,lastb)或类似内容以达到预期的效果。