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

6.2. Списки

251 изменяют V, лучший подход должен был бы объявить, что аргументом была постоянная ссылка вместо этого, то есть, «константа vector<int>&».

Проблема возникает, однако, если мы объявляем iterator для такого вектора. Много внедрений STL производят сообщение об ошибке, если мы пытаемся использовать регулярный проход - ator с постоянной векторной ссылкой, так как такой iterator может привести к попытке изменить содержание вектора.

Решение - специальный iterator только для чтения, названный константой iterator. Используя константу iterator, возможно прочитать ценности контейнера dereferencing iterator, но не возможно изменить ценности контейнера. Например, если p - константа iterator, возможно прочитать ценность *p, но Вы не можете назначить ему стоимость. Константа iterator тип для нашего векторного типа обозначена «вектор <интервал>:: константа iterator». Мы используем команду typedef, чтобы переименовать это длинное определение более краткому ConstIterator. Заключительный кодовый фрагмент представлен в Кодовом Фрагменте 6.15.

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

вектор typedef <интервал>:: константа iterator ConstIterator;//iterator тип

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

s гм + = * p;

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

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

STL находящиеся в Iterator контейнерные функции

STL iterators предлагают flexible и однородный способ получить доступ к элементам довода «против» STL -

tainers. Многие из участника функционируют и предопределенные алгоритмы, которые работают с iterators использования контейнеров STL как их аргументы. Вот несколько членских функций векторного класса STL, которые используют iterators в качестве аргументов. Позвольте V быть вектором STL некоторого данного основного типа и позволить e быть объектом этого основного типа. Позвольте p и q быть iterators по этому основному типу, оба привлеченные из того же самого контейнера.

вектор (p, q): Постройте вектор, повторив между p и q, копируя

каждый из этих элементов в новый вектор.

назначьте (p, q): Удалите содержание V, и назначает его новое содержание

повторяя между p и q и копируя каждый из этих элементов в V.

вставка (p, e): Вставьте копию e только до положения, данного проходом -

ator p и изменения последующие элементы одно положение вправо.

сотрите (p): Удалите и разрушьте элемент V в положении

данный p и изменениями последующие элементы одно почтовое -

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

sition налево.

сотрите (p, q): Повторите между p и q, удалив и разрушив все

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

ясный (): Удалите все эти элементы V.

Представляя диапазон ценностей iterator (поскольку мы сделали выше с

конструктор V (p, q), назначают (p, q), и стирают (p, q)), диапазон iterator, как понимают, начинает с p и конца только до q. Заимствуя из примечания интервала в математике - рвотные средства, этот диапазон iterator часто выражается как [p, q), подразумевая, что p включен в диапазон, но q не. Это соглашение держится, имея дело с диапазонами iterator.

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

Вышеупомянутые функции также определены для списка STL и STL deque (но, конечно, конструкторов называют по-другому). Так как список определен как dou - bly связанный список, нет никакой потребности переместить элементы, выполняя вставку или стереть. Эти три контейнера STL (вектор, список и deque) называют, последовательность содержат - ers, потому что они явно хранят элементы в последовательном заказе. Набор контейнеров STL, мультинабор, карта и мультикарта поддерживают все вышеупомянутые функции кроме, назначают. Их называют связанными контейнерами, потому что к элементам, как правило, получают доступ, обеспечивая связанное значение ключа. Мы обсуждаем их в Главе 9.

Это - стоящее замечание, что, в конструкторе и функциях назначения, iterators p и q не должны быть оттянуты из того же самого типа контейнера как V, пока у контейнера, из которого они привлечены, есть тот же самый основной тип. Например, предположите, что L - контейнер списка STL целых чисел. Мы можем создать копию L в форме вектора STL V следующим образом:

список <интервал> L; //список STL целых чисел//... вектор <интервал> V (L.begin (), L.end ()); //инициализируют V, чтобы быть копией L

Находящаяся в iterator форма конструктора довольно удобна, так как она обеспечивает легкий способ инициализировать содержание контейнера STL от стандарта C ++ множество. Здесь, мы используем особенность низкого уровня C ++, который унаследован от его prede-cessor, языка программирования C. Вспомните из Раздела 1.1.3, что C ++ выстраивает A, представлен как указатель на его первый элемент [0]. Кроме того, + 1 пункт на [1], + 2 пункта на [2], и обычно + я указываю на [меня].

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