c ++ список итераторов идеи арифметической замены

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

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

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 для меня не вариант, так как я хочу первый экземпляр совпадения с начала списка.

Есть ли лучший способ реализации здесь?

1

Решение

Да, вы можете сделать это

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 )
{
//...
}
}
0

Другие решения

Поскольку это список, произвольный доступ медленный. К счастью для вас:

  1. ты всегда начинаешь с самого начала, и
  2. std::list имеет метод size ()

вот один из способов:

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

Вы можете использовать обратный итератор и std :: advance

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

}
0
По вопросам рекламы [email protected]