2015-10-27 4 views
1

У меня есть список, к которому можно получить доступ в нескольких местах. Есть некоторые случаи, когда мне нужно прокручивать список от начала до (end-n) элементов и других, где доступен весь список. У меня возникают проблемы с арифметикой итератора.C++ list итератор арифметические идеи замены

Я хочу что-то, что может сделать следующее:

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(), увеличьте его size() - 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 :: advance

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

}