Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
STL5 / lab1-vector / lab1-vector.doc
Скачиваний:
12
Добавлен:
10.04.2015
Размер:
183.3 Кб
Скачать

Итераторы5

Итераторы – объекты, предназначенные для перечисления элементов некоторой коллекции, или и в более общем случае некоторой последовательности. Минимальный интерфейс итератора содержит два метода: метод получения текущего элемента коллекции на который указывает итератор и метод перехода к следующему элементу коллекции. Итераторы STLиспользуют для этих целейoperator* (оператор разыменования) для получения текущего элемента иoperator++ (оператор постинкремента) для переходя к следующему элементу. Перед использованием итератор должен быть проинициализирован некоторым значением, чтобы он указывал на элемент коллекции, например на первый элемент. Для проверти того, что итератор достиг конца коллекции обычно используется сравнение со специальным итератором, указывающим на элемент следующий за последним.

Класс vectorсодержит следующие методы для работы с итераторами, которые могут быть использованы для перечисления его элементов.

template <class T, class A=allocator<T>> class vector {

public:

//…..

// итераторы

// возвращают итератор указывающий на первый элемент

// (нумерация начинается с нуля)

iterator begin();

const_iterator begin() const;

// возвращает итератор указывающий на следующий за последним

// элемент (фиктивный итератор, сравнение какого-либо другого

// итератора с ним используется для определения,

// пройдена ли вся последовательность)

iterator end();

const_iterator end() const;

// возвращает итератор указывающий на последний элемент, используется

// при перечислении элементов в обратной последовательности

reverse_iterator rbegin();

const_reverse_iterator rbegin() const;

// возвращает итератор указывающие на элемент перед первым,

// этот итератор может быть использован для определения

// конца последовательности элементов при прохождении ее в обратном порядке

reverse_iterator rend();

const_reverse_iterator rend() const;

//….

};

Ниже приведен фрагмент кода, использующие итераторы для перечисления и распечатывания элементов вектора в прямом и обратном порядке.

#include <vector>

#include <iostream>

using namespace std;

vector<int> VectorOfInt;

… // некий код заполняющий вектор элементами

// перечисление элементов в прямом порядке

vector<int>::iterator iter;

iter = VectorOfInt.begin(); // инициализация итератора, так чтобы он

// указывал на первый элемент

while (iter != VectorOfInt.end()) // проверка на окончание коллекции

{

cout << *iter << ‘\n’; // получение текущего элемента

iter++; // переход к следующему итератору

}

// перечисление элементов в обратном порядке

vector<int>::reverse_iterator iter;

iter = VectorOfInt.rbegin(); // инициализация итератора, так чтобы он

// указывал на последний элемент

while (iter != VectorOfInt.rend()) // проверка на окончание коллекции

{

cout << *iter << ‘\n’; // получение текущего элемента

iter++; // переход к следующему итератору

}

Итераторы вектора, которые могут быть получены функциями begin(),end(),rbegin(),rend() являются итераторами произвольного доступа6и аналогично встроенным указателям могут участвовать в арифметических выражениях. Результатом этих арифметических выражений является итератор указывающий на другой элемент.

vector<int> vec;

vec.push_back(1);

vec.push_back(2);

vec.push_back(3);

vec.push_back(4);

vec.push_back(5);

int element = *(vec.begin() + 2);

// element == 3

int element = *(vec.end() - 1);

// element == 5

Однако необходимо помнить, что арифметические выражения не должны приводить к выходу итераторов за границы допустимых диапазонов.

// вектор содержащий 5 элдементов

vector<int> vec(5);

vector<int>::iterator iter = vec.begin() + 10; // Итератор вышел из допустимого

// диапазона

int element = *iter; // ошибка, неопределенной поведение

Соседние файлы в папке lab1-vector