Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

6.2. Списки

249 Кодовых Фрагментов 6.13. К элементам получают доступ стандартным способом через оператора индексации.

интервал vectorSum1 (константа vector<int>& V)

международная сумма = 0;

для (интервал i = 0; я <V.size (); я ++)

суммируйте + = V [я];

возвратите сумму;

Кодовый Фрагмент 6.13: простой C ++ функция, которая суммирует записи вектора STL.

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

STL Iterators

Каждый контейнерный класс STL определяет специальный связанный класс, названный iterator. Как

упомянутый ранее, iterator - объект, который определяет положение в пределах контейнера и который обеспечен способностью провести к другим положениям. Если p - iterator, который относится к некоторому положению в пределах контейнера, то *p приводит к ссылке на связанный элемент.

Продвижение к следующему элементу контейнера сделано, увеличив iterator. Например, или ++ p или p ++ достижения p, чтобы указать на следующий ele-ment контейнера. Прежняя прибыль обновленная ценность iterator и последняя прибыль его первоначальная стоимость. (В нашем внедрении iterator для класса NodeList в Кодовом Фрагменте 6.7, мы определили только оператора перед приращением, но оператор постприращения будет легким расширением. Посмотрите Упражнение R-6.13.)

Каждый контейнерный класс STL обеспечивает две членских функции, начните и закончите, каждый из которых возвращает iterator для этого контейнера. Первая прибыль iterator, который указывает на первый элемент контейнера и вторую прибыль iterator, который может считаться указывающий на воображаемый элемент только вне последнего элемента контейнера. Пример для случая списков показали в рисунке 6.5 и примере того, как это работает на вектор STL, показан в рисунке 6.6.

V.begin () V.end ()

V [0] V [1] V [2] V [n- 1]

Рисунок 6.6: специальный iterators V.begin () и V.end () для вектора STL V.

250 Глава 6. Список и Iterator adTs

Используя Iterators

Давайте посмотрим, как мы можем использовать iterators, чтобы перечислить элементы контейнера STL

C. Предположим, например, что C имеет вектор типа <интервал>, то есть, это - список STL целых чисел. Связанный тип iterator обозначен «вектор <интервал>:: iterator». В целом, если C - контейнер STL некоторого типа продолжение следует, и основной тип имеет основу типа, то тип iterator был бы обозначен, «продолжение следует <базируйтесь>:: iterator».

Например, Кодовый Фрагмент 6.14 демонстрирует, как суммировать элементы вектора STL V использований iterator. Мы начинаем, предоставляя определение типа Итере - тип скалистой вершины, названный Iterator. Мы тогда создаем петлю, которой управляет iterator p. Мы начинаем с V.begin (), и мы заканчиваем, когда p достигает V.end (). Хотя этот подход менее прямой, чем подход, основанный на индексации отдельных элементов, у этого есть преимущество, что это может быть применено к любому контейнерному классу STL, не просто векторам.

интервал vectorSum2 (вектор <интервал> V)

вектор typedef <интервал>:: iterator Iterator;

международная сумма = 0; для (Iterator p = V.begin (); p! = V.end (); ++ p)

s гм + = * p;

возвратите сумму;

//тип iterator

Кодовый Фрагмент 6.14: Используя iterator, чтобы суммировать элементы вектора STL.

Различные контейнеры предоставляют iterators различные возможности. Большинство контейнеров STL (включая списки, наборы и карты) обеспечивает способность переместиться не только вперед, но и назад также. Для таких контейнеров операторы декремента-p и p-также определены для их iterators. Это называют двунаправленным iterator.

Несколько контейнеров STL (включая векторы и deques) поддерживают дополнительную функцию разрешения дополнения и вычитания целого числа. Например, для такого iterator, p, стоимость p + 3 ссылки элемент три положения после p в контейнере. Это называют произвольным доступом iterator.

Как с указателями, уход необходим в использовании iterators. Например, это до программиста, чтобы быть уверенным, что iterator указывает на действительный элемент контейнера прежде, чем делать попытку к dereference его. Пытаясь к dereference недействительный iterator может привести к Вашему прерыванию программы. Как отмечалось ранее, iterators может быть недействительным по различным причинам. Например, iterator становится недействительным, если положение, к которому он относится, удалено.

Константа Iterators

Заметьте, что в Кодовом Фрагменте 6.14, мы передали вектор V в функцию

стоимостью (вспоминают Раздел 1.4). Это может быть довольно неэффективно, потому что система строит полную копию фактического аргумента. Так как наша функция не делает