STL итераторы

Итератор — это объект, который предоставляет доступ к содержимому контейнера. В зависимости от контейнера, категории итераторов могут отличаться. Рассмотрим на примере контейнера 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() мы проверяем на выход за предел последовательности элементов. В теле цикла мы выводим текущий элемент списка. В этом примере мы выводили элементы списка в прямом порядке.

Теперь выведем элементы в обратном порядке. Здесь есть одна особенность связанная с методом 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;
}

Вы можете оставить комментарий ниже.

Оставить комментарий

Яндекс.Метрика