мой код
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
Список имеет только двунаправленный итератор (Вы можете только увеличивать или уменьшать итератор с помощью ++ или -). Чтобы продвинуть итератор на три, вы можете использовать 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).
В списке вы не можете продвинуть итератор по n
мгновенно (например, it+3
), потому что это не итератор произвольного доступа. Тем не менее, вы можете увеличить итератор в 3 раза: ++(++(++it)))
,
Как указано в комментарии, вы можете использовать std::advance(it,3)
но для итератора списка это будет сводиться к многократному вызову ++it
три раза.