跳过随机迭代器的一个条目

Skip an entry of a random iterator

本文关键字:一个 随机 迭代器      更新时间:2023-10-16

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

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

问题a(:有没有办法跳过索引firsta<i<lastb修改CCD_ 5的输入——例如随机迭代器,换句话说,在不改变foo本身的情况下,仅仅改变其输入?

--不幸的是,我想跳过的索引不在边缘(它们通常位于firstalasta之间(和foo是一个复杂的鸿沟&不可接受的征服算法在原始数组的子集上调用迭代器正在指向。

问题b(:如果做a(是可能的,那么做的成本是多少?常数还是依赖于(lasta-firsta)

最好的方法是使用知道如何跳过该元素的迭代器。不过,一个更通用的想法是迭代器,它只是在引擎盖下的两个独立范围上进行迭代。我不知道boost中有什么能做到这一点,所以,我刚刚总结了一个:http://coliru.stacked-crooked.com/a/588afa2a353942fc

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

答案可能有点挑剔,但您可以调用foo(firsta,i-1)foo(i+1,lastb)或类似的东西来获得所需的效果。