У меня есть список, который доступен в нескольких местах. В некоторых случаях мне нужно перебирать список от начала до (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 для меня не вариант, так как я хочу первый экземпляр совпадения с начала списка.
Есть ли лучший способ реализации здесь?
Да, вы можете сделать это
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 )
{
//...
}
}
Поскольку это список, произвольный доступ медленный. К счастью для вас:
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
}
Вы можете использовать обратный итератор и std :: advance
auto rit =final.rbegin();
std::advance(rit, n);
for (auto itr=final.begin(); itr!=rti.base(); ++itr) {
}