|
Программирование >> Операторы преобразования типа
Удаление первого элемента со значением 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
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |