2015-10-27 32 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) { 

}