Как перемещаться по списку с помощью итераторов? (C ++)

мой код

list<int> foo;
for (int i = 0; i < 20; i++) {
foo.push_back(i);
}
for (std::list<int>::iterator it = foo.begin(); it != foo.end(); it++)
std::cout << *it << ' ';

Я хочу, чтобы мой итератор увеличился на 3

и вывод будет:

0 3 6 9 12 15 18

вместо:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

1

Решение

Список имеет только двунаправленный итератор (Вы можете только увеличивать или уменьшать итератор с помощью ++ или -). Чтобы продвинуть итератор на три, вы можете использовать std :: advance (it, 3), но это может пройти конец и привести к бесконечному циклу / неопределенному поведению.

Следовательно:

#include <iostream>
#include <list>

int main()
{
std::list<int> foo;
for (int i = 0; i < 20; i++) {
foo.push_back(i);
}
std::list<int>::iterator it = foo.begin();
while(it != foo.end()) {
std::cout << *it << ' ';
// Advance by three, stop at end
for(int i = 0; i < 3 && it != foo.end(); ++i, ++it);
}
return 0;
}

Примечание. Вместо этого вы можете выбрать другой контейнер, поддерживающий произвольный доступ (std :: array, std :: vector, std :: deque).

1

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

В списке вы не можете продвинуть итератор по n мгновенно (например, it+3), потому что это не итератор произвольного доступа. Тем не менее, вы можете увеличить итератор в 3 раза: ++(++(++it))),

Как указано в комментарии, вы можете использовать std::advance(it,3) но для итератора списка это будет сводиться к многократному вызову ++it три раза.

3

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