Программирование >>  Операторы преобразования типа 

1 ... 45 46 47 [ 48 ] 49 50 51 ... 239


Занести в соП копию содержимого 1 coll.assign(1 .beginO.1 .endO):

Обращение к элементам

в табл. 6.5 перечислены все операции прямого обращения к элементам векторов. Как принято в С и С++, первому элементу вектора соответствует индекс О, а последнему - индекс size()-l. Таким образом, тг-му элементу соответствует индекс п-1. Для неконстантных векторов эти операции возвращают ссылку на элемент и поэтому могут использоваться для модификации элементов (при условии, что модификация не запрещена по другим причинам).

Таблица 6.5. Операции обращения к элементам вектора Операция Описание

c.at(idx) Возвращает элемент с индексом idx (при недопустимом значении индекса

генерируется исключение out of range)

c[tdx] Возвращает элемент с индексом idx (без интервальной проверки!)

c.frontO Возвращает первый элемент (без проверки его существования!)

с.Ьаск() Возвращает последний элемент (без проверки его существования!)

Самый важный аспект для вызывающей стороны - наличие или отсутствие интервальной проверки при обращении к элементу. Такая проверка выполняется только функцией at(). Если индекс не входит в интервал допустимых значений, генерируется исключение out of range (см. с. 45). Остальные функции выполняются без проверки, и интервальные ошибки приводят к непредсказуемым последствиям. Вызов оператора [], функций front() и Ьаск() для пустого контейнера всегда приводит к непредсказуемым постедствиям.

std; :vector<EleiTi> coll: Пустой вектор!

coll[5] = elem: ОШБКА ВРЕМЕНИ ВЫПОЛНЕНИЯ

std;:cout coll,front(); ОШИБКА ВРЕМЕНИ ВЫПОЛНЕНИЯ

Следовательно, перед вызовом оператора [] необходимо убедиться в том, что индекс имеет допустимое значение, а перед вызовом функции front() или Ьаск() - что контейнер не пуст:

std::vector<Elem> coll: Пустой вектор!

if (coll,SizeO > 5) {

coll[5] = elem: OK

if (!coll .emptyO) {

cout coll .frontO; OK

coll.at(5) = elem; Генерирует исключение out of range



Функции получения итераторов

Векторы поддерживают стандартный набор операций для получения итераторов (табл. 6.6). Итераторы векторов относятся к категории итераторов произвольного доступа (категории итераторов рассматриваются на с. 257). Это означает, что с векторами в принципе могут использоваться псе алгоритмы STL.

Таблица 6.6. Операции получения итераторов Операция Описание

c.beginO Возвращает итератор произвольного доступа для первого элемента

c.end() Возвращает итератор произвольного доступа для позиции за последним

элементом

C.rbeginO Возвращает обратный итератор для первого элемента при переборе в

обратном направлении

C.rendO Возвращает обратный итератор для позиции за последним элементом

при переборе в обратном направлении

Фактический тип итераторов определяется реализацией, однако для векторов итераторы часто оформляются в виде обычных указателей. Обычный указатель соответствует требованиям к итератору произвольного доступа, а поскольку по своей внутренней структуре вектор, как правило, представляет собой массив, обычные указатели обеспечивают нужное поведение. Впрочем, рассчитывать па то, что итератор является указателем, не следует. Например, в безопасной версии STL с проверкой интервальных ошибок и других потенциа.льных проблем итераторы обычью оформляются в виде вспомогательного класса. На с. 264 рассказано о неприятностях, возникающих из-за различий между реализациями итераторов (в виде указателей и классов).

Итераторы остаются действительными до момента вставки или удаления элемента с меньшим индексом или перераспределения памяти с изменением емкости (см. с. 157).

Вставка и удаление элементов

В табл. 6.7 перечислены операции вставки и удаления элементов, поддерживаемые векторами. Как это обычно бывает при использовании STL, правильность аргументов обеспечивается вызывающей стороной. Итераторы должны ссылаться на правильные позиции, конец интервала не должен предшествовать началу, элементы не должны удаляться из пустого контейнера.

Таблица 6.7. Операции вставки и удаления для векторов Операция Описание

c.insert(pos,elenfi) Вставляет в позицию итератора pos копию элемента elem и возвращает позицию нового элемента

c.insert(pos,n,elenfi) Вставляет в позицию итератора pos п копий элемента elem (и не возвращает значения)



Операция Описание

c.insert(pos,beg,end) Вставляет копию всех элементов интервала [beg,end) в позицию итератора pos (и не возвращает значения)

c.push back(elem) Присоединяет копию elem в конец вектора

с.рор Ьаск() Удаляет последний элемент (не возвращая его)

c.erase(pos) Удаляет элемент в позиции итератора pos и возвращает позицию

следующего элемента

c.erdse(beg,end) Удаляет все элементы из интервала [begend) и возвращает позицию следующего элемента

c.resize(num) Приводит контейнер к размеру num (если size() при этом увеличивается,

новые элементы создаются своим конструктором по умолчанию)

c.resize(num,elem) Приводит контейнер к размеру num (если size() при этом увеличивается, новые элементы создаются как копии elem)

с.с1еаг() Удаляет все элементы (контейнер остается пустым)

Что касается эффективности, следует помнить, что вставка и удаление выполняются быстрее, если:

О элементы вставляются или удаляются в конце интервала;

О на момент вызова емкость контейнера достаточно велика, чтобы операция выполнялась без перераспределения памяти;

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

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

Векторы не поддерживают операции прямого удаления элементов с некоторым значением. Для этой цели применяется алгоритм. Например, следующая команда удаляет все элементы со значением val:

std: :vector<Elein> coll;

Удаление всех элементов со значением val col 1.erase(remove(col1.beg1n().col 1,end(). val), coll,end());

Эта конструкция описана на с. 125.

Следующий фрагмент удаляет из вектора только первый элемент с некоторым значением:

std;:vector<Elem> coll;

Естественно, позиция в операциях вставки/удаления задается итератором. - Примеч. перев.



1 ... 45 46 47 [ 48 ] 49 50 51 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика