假设我们有一个函数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
本身,只是它的输入?
- 不幸的是,我想要跳过的索引不在边缘
(它们通常位于firsta
和lasta
)和foo
之间
是一种复杂的分而治之的算法,它不适合
在原始数组的子集上调用迭代器
指着。
问题b):如果可以做a),那么这样做的成本是多少?
常数还是取决于(lasta-firsta)
?
答案 0 :(得分:3)
执行此操作的最佳方法是使用知道如何跳过该元素的迭代器。然而,一个更普遍的想法是迭代器,它简单地遍历两个不同的范围。我不知道有什么事情可以做到这一点,所以,这是我刚刚掀起的一个:http://coliru.stacked-crooked.com/a/588afa2a353942fc
不幸的是,检测要跳过哪个元素的代码会为每个迭代器增量增加少量开销,因此开销在技术上与lasta-firsta
成比例。实际上,在vector::iterator
或char*
周围使用此包装应该会使其与std::deque::iterator
大致达到相同的性能级别,因此不应该是这种情况应该是主要的减速。
答案 1 :(得分:1)
答案可能有点挑剔,但您可以拨打foo(firsta,i-1)
和foo(i+1,lastb)
或类似内容以达到预期的效果。