2012-07-09 68 views
1

我有一个迭代器。假设我需要不是从一开始就从某个特定点开始遍历集合。对于我来说,获取存储在集合中的值是非常困难的,因为它们是指针。因此,如何修改我的代码以便从不是开始的点遍历我的集合。 ?遍历从一个特定索引到特定索引的集合

下面是代码:

for(iter=make.at(level).begin();iter!=make.at(level).end();iter++) 
{ 
Function(*iter); 
} 

使用此给出了一个错误:

for(iter=make.at(level).begin()+10;iter!=make.at(level).end();iter++) 
    { 
    Function(*iter); 
    } 

回答

1

有不同类型的迭代器:ForwardIteratorBidirectionalIteratorRandomAccessIterator

ForwardIterator允许您仅使用增量运算符向前移动。 BidirectionalIterator允许两个方向。 RandomAccessIterator允许任何升级,包括operator+operator-

你在想的那个是RandomAccessIterator,就像在std::vector中找到的那个。但std::set使用的是BidirectionalIterator。这意味着你只能增加和减少。

因此,您需要将循环迭代器放在循环之外并向前推进十次。为了简单起见,std::advance这样做,并且对于BidirectionalIterator以及ForwardIterator(线性时间,因为一次只有一个增量)和RandomAccessIterator(由于operator +的恒定时间)具有不同的兼容性。

std::set<T>::iterator iter = make.at(level).begin(); //more C++03 way 
auto iter = std::begin (make.at(level)); //more C++11 way 
std::advance (iter, 10); //start iterator 10 elements past beginning 
for (...) 
+0

iter = make.at(level).begin(); advance(iter,10);对于(; iter!= make.at(level).end(); iter ++) { 函数(* iter); } 但是这不起作用。 – 2012-07-09 08:29:40

+0

@ user1506031,您能否生成一个复制问题并询问问题的小样本?但有一点需要注意的是,你应该习惯于使用'++ iter',而不是'iter ++'与迭代器(并且它确实不会影响其他的东西)。 – chris 2012-07-09 08:40:21

+0

只有现在才能以这种方式工作.. :)有问题与范围检查。 – 2012-07-09 08:44:44