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

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


Удаление первого элемента со значением val std; ;vector<Ele[n>;:Iterator pos: pos = f1nd(col 1-beginO .con .endO. val):

If (pos != соП .endO) { col 1.erase(pos);

Векторы как обычные массивы

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

8iv[i] -= &v[0] + 1

Из гарантированного выполнения этого условия следует один важный факт: вектор может задействоваться во всех случаях, когда в программе используется динамический массив. Например, в векторе можно хранить данные обычных строк С типа char* или const char*:

std;;vector<char> v: Создание вектора как

динамического массива типа char

v.reslze(41): Выделить память для 41 символа (включая \0)

strcpy(&v[0]. hello, world ); Копирование строки С в вектор

printf(*s\n , &v[0]): Вывод содержимого вектора в виде строки С

Конечно, при таком использовании вектора необходима осторожность (впрочем, при работе с динамическими массивами она необходима всегда). Например, вы ДОЛЖ1Ш следить за тем, чтобы размер вектора был достаточным для хранения всех копируемых данных, а если содержимое вектора потребуется как строка С, оно должно завершаться элементом \0. Однако приведенный пример показывает, что когда в программе необходим массив типа Т (например, для существующей библиотеки С), вы можете использовать вектор vector[T] и передать адрюс первого элемента.

Обратите в>гимание: передавать итератор вместо адреса первого элемента было бы неправильпо. Тип векторного итератора определяется реализацией; вполне возможно, что он не имеет ничего общего с обьшиым указателем:

pr1ntf( s\n . V.beginO); ОШИБКА Сможет работать,

но нарушает переносимость) printf( 3;s\n . &v[0]); OK

Обработка исключений

проверка логических ошибок в векторах сведена к минимуму. Согласно стандарту, исключения генерирует только одна функция at() - безопасная версия



оператора индексирования (см. с. 161). Кроме того, стандарт требует, чтобы происходили только стандартные исключения - такие, как bad alloc при нехватке памяти, или исключения при выполнении пользовательских операций.

Если функции, вызванные вектором (функции, о]1ределенные при определении тина элемента или переданные пользователем), инициируют исключения, стандартная библиотека С++ гарантирует следующее.

О Если исключение происходит при вставке элемента функцией push back(), эта функция пе вносит изменений в контейнер.

О Если операции копирования (копирующий конструктор и оператор присваивания) не генерируют исключений, то функция insert() либо выполняется успешно, либо не вносит изменений.

О Функция рор Ьаск() не генерирует исключений.

О Если операции копирования (копирующий конструктор и оператор присваивания) не генерируют исключений, то функции erase() и с1еаг() тоже не генерируют исключений.

О Функция swapO не генерирует исключений.

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

Все перечисленные гарантии основаны на том, что деструкторы не генерируют исключения. На с. 148 приведены общие сведения об обработке исключений в STL, а на с. 254 перечислены все контейнерные операции, для которых предоставляются особые гарантии в отношении исключений.

Примеры использования векторов

Ниже приведен простой пример, демонстрирующий практическое применение векторов.

cont/vectorl,cpp #1nclude <iostream> #1nclude <vector> #1nclude <str1ng> #inc1ude <algor1thm> using namespace std:

int mainO {

Создание пустого вектора для хранения строк vectar<string> sentence;

Резервируем память для пяти элементов. чтобы предотвратить перераспределение sentence.reserve(5);



Присоединение нескольких злементов sentence.push back( Hello. ); sentence.push back( how ) sentence.push back( are ) sentence.push back( you ) sentence.push back( ? ):

Вывод элементов, разделенных пробелами copy (sentence.beginO. sentence.endO.

ostreani 1 terator<string>(cout. )); cout endl;

Вывод служебных данных

cout niax size(): sentence.niax size() endl cout sizeO: sentence.sIzeO endl cout capacityO: sentence.capacityO endl

Перестановка второго и четвертого элемента swap (sentence[l]. sentence[3]);

Вставка элемента always перед элементом ? sentence, insert (flnd(sentence.beginO .sentence.endO. ? ) always ):

Присваивание ! последнему элементу sentence.back О = ! :

Вывод элементов, разделенных пробелами сору (sentence.beginO . sentence.endO.

ostreani lterator<string>(cout. )): cout endl:

Повторный вывод служебных данных cout niax size(): sentence.nax size() endl cout SizeO: sentence.sizeO endl cout capacityO; sentence.capacityO endl

Результат выполнения программы выглядит примерно так:

Hello, how are you?

niax size(); 268435455

sizeO: 5

capacityO: 5 Hello, you are how always

nax slzeO: 268435455

SizeO: 6

capacityO: 10



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

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