2015-10-27 29 views
1

我有被在多个地方访问列表。有些情况下,我在列表中从开始到(完-N)元素和其他地方被访问整个列表需要循环。我在迭代器算术中遇到了麻烦。C++列表迭代算法替换的想法

我想要的东西,可以做到以下几点:

int n =10; 
for (list<Term>::iterator itr = final.begin(); itr != (final.end()-n); itr++) { 
// 
} 

做以下的伪代码有意义吗?

int N = myList.size() - n; 
for (list<Term>::iterator itr = final.begin(),int length_reached=0; itr != (final.end() && length_reached<N; itr++,length_reached++) { 
// 
} 

对我而言,使用rbegin不是一个选项,因为我想从列表的开始处开始匹配的第一个实例。

有没有在这里实现一个更好的办法?

+0

递增运算符是唯一的选择你...通过begin()获得一个迭代器,增加它的大小() - n次。 – basav

回答

0

是的,你可以做这样

if (n < final.size()) 
{ 
    auto m = final.size() - n; 

    for (auto first = final.begin(); m != 0; ++first, --m) 
    { 
     //... 
    } 
} 

如果迭代器本身可以循环改变,那么你可以写循环条件如下方式对迭代器

if (n < final.size()) 
{ 
    auto m = final.size() - n; 

    for (auto first = final.begin(); m != 0 && first != final.end(); ++first, --m) 
    { 
     //... 
    } 
} 
3

因为它是一个列表,随机访问速度很慢。幸运的是:

  1. 你总是从头开始,并
  2. std::list的大小()方法

这里有一个方法:

list<Term>::iterator itr = final.begin(); 
int to_do = std::max(0, int(final.size()) - n); 
for (; to_do ; --to_do, ++itr) 
{ 
    // code here 
} 
0

可以使用反向迭代和的std ::提前

auto rit =final.rbegin(); 
std::advance(rit, n); 
for (auto itr=final.begin(); itr!=rti.base(); ++itr) { 

}