STL итераторы | Обучение программированию онлайн

Опубликовано: 01.09.2018

видео STL итераторы | Обучение программированию онлайн

Copy of stl итераторы c++

Итератор — это объект, который предоставляет доступ к содержимому контейнера. В зависимости от контейнера, категории итераторов могут отличаться. Рассмотрим на примере контейнера list. Контейнер list представляет собой двусвязный список. List-итераторы относятся к категории двунаправленных. Перейдем к примеру.



list<int> numbers; for(int i = 10; i < 20; i++) numbers.push_back(i);

Здесь мы создали список numbers для хранения int значений и затем в цикле заполняем его значениями от 10 до 19 включительно.

list<int>::iterator ptr; for(ptr = numbers.begin(); ptr != numbers.end(); ptr++) cout<<*ptr<<" "; cout<<endl;

Теперь мы создали итератор ptr. Принцип работы итераторов очень похожий на работу указателей: для получения значения также используется оператор разыменования, операции инкремента и декремента обеспечивают доступ в прямом и обратном направлении соответственно. Метод begin() возвращает итератор первого элемента списка, который мы присваиваем нашему итератору ptr. Условием ptr != numbers.end() мы проверяем на выход за предел последовательности элементов. В теле цикла мы выводим текущий элемент списка. В этом примере мы выводили элементы списка в прямом порядке.


STL: ассоциативные контейнеры и итераторы

Теперь выведем элементы в обратном порядке. Здесь есть одна особенность связанная с методом end(). Делом в том, что метод end() возвращает итератор не последнего элемента, а итератор, который ссылается на область памяти, расположенную за пределами контейнера. Поэтому запустив следующий код, мы получим исключение.

//ошибка! for(ptr = numbers.end(); ptr != numbers.begin(); ptr--) cout<<*ptr<<" ";

Чтобы не возникало ошибок, сначала необходимо выполнить операцию декремента, а затем вывод элемента. Вот пример правильной реализации.

//вывод в обратном порядке for(ptr = numbers.end(); ptr != numbers.begin(); ) { ptr--; cout<<*ptr<<" "; }

Полный код программы

#include <iostream> #include <list> using namespace std; void main() { list<int> numbers; for(int i = 10; i < 20; i++) numbers.push_back(i); list<int>::iterator ptr; for(ptr = numbers.begin(); ptr != numbers.end(); ptr++) cout<<*ptr<<" "; cout<<endl; //ошибка! /*for(ptr = numbers.end(); ptr != numbers.begin(); ptr--) cout<<*ptr<<" "; */ for(ptr = numbers.end(); ptr != numbers.begin(); ) { ptr--; cout<<*ptr<<" "; } cout<<endl; } Вы можете оставить комментарий ниже.
rss