|
Программирование >> Операторы преобразования типа
Спасибо Джону Спайсеру (John Н. Spicer) из EDO за это объяснение. О Инициализация элементами массива: int дггдуи = { 2. 3, 17. 33. 45. 77 }: Копирование всех элементов массива в множество std::set<Tnt> c(array,array+sizeof(array)/sizeof(array[0])); О Инициализация с применением стандартного входного потока данных: Чтение элементов типа int в дек из стандартного ввода std::deque<int> c((std::istreani iterator<int>(std::cin)). (std::1stredn iterator<i nt>())): He забудьте заключить аргументы инициализатора в дополнительные круглые скобки. Без них выражение работает совсем не так, как предполагалось. Скорее всего, все кончится странными предупреждениями или ошибками в следую-них командах. Рассмотрим ту же команду без дополнительных круглых скобок: std::deque<int> c(std::1streani iterator<int>(std:;cin), std:: 1streani iterator<int>()): В этом варианте с объявляет функцию, возврашаюшую тип deque<int>. Ее первый параметр cin относится к типу istreanri iterator<int>, а второй безымянный параметр - к типу функция, вызываемая без аргументов и возвращающая istream iterator<int> . Эта конструкция синтаксически действительна и как объявление, и как выражение. Следовательно, в соответствии с правилами языка она интерпретируется как объявление. При введении дополнительных круглых скобок инициализатор перестает соответствовать синтаксису объявления. В принципе эта методика также применяется при присваивании или вставке элементов из другого интервала. Однако в этих операциях интерфейс либо отличается наличием дополнительных аргументов, либо поддерживается не всеми контейнерными классами. Операции проверки размера Все контейнерные классы поддерживают три операции, связанные с проверкой размера. О size(). Функция возвращает текущее количество элементов в контейнере. О empty(). Сокрапенная форма проверки нулевого текущего количества элементов в контейнере (size()==0). Однако функция empty() может быть реализована более эффективно, поэтому по возможности следует использовать именно ее. О max size(). Функция возвращает максимальное количество элементов, которые могут содержаться в контейнере. Значение зависит от реализации. Например, все элементы вектора обычно хранятся в одном блоке памяти, что может обусловить дополнительные ограничения на PC. В общем случае nriax size() совпадает с максимальным значением типа индекса. Сравнения обычные операторы сравнения ==, !=, <, <=, > и >= определяются по следующим трем правилам. О Оба контейнера должны относиться к одному типу. О Два контейнера равны, если их элементы совпадают и следуют в одинаковом порядке. Проверка на равенство элементов выполняется оператором ==. О Отношение меньше/больше между контейнерами проверяется по лексикографическому критерию (см. с. 356). Для сравнения разнотипных контейнеров применяются алгоритмы сравнения, описанные на с. 352. Присваивание и функция swap в процессе присваивания контейнеров все элементы коатейнера-нсточника копируются, а все элементы контейнера-приемника удаляются. Таким образом, присваивание контейнеров является относительно дорогостоящей операцией. Если контейнеры относятся к одному типу, а источник в дальнейшем не требуется, существует простой способ оптимизации: воспользуйтесь функцией swap(). Функция swapO работает гораздо эффективнее, потому что использует только внутренние данные контейнеров. Более того, она переставляет только внутренние указатели со ссылками на данные (элементы, распределитель памяти и критерий сортировки, если он есть). Следовательно, функция swapQ при присваивании заведомо выполняется с постоянной, а не с линейной сложностью. Векторы Вектором называется абстрактная модель, имитирующая динамический массив при операциях с элементами (рис. 6.1). Однако стандарт не утверждает, что в реализации вектора должен использоваться именно динамический массив. Скорее этот выбор обусловлен ограничениями и требованиями к сложности операций. Рис. 6.1. Структура вектора Чтобы использовать вектор в программе, необходимо включить в нее заголовочный файл <vector>: #include <vector> В исходной версии STL вектор определялся в заголовочном фа11ле <vector.h>. Тип вектора определяется как шаблон класса в пространстве имен std: namespace std { template <class Т. class Allocator = allocator<T> > class vector: Элементы вектора относятся к произвольному типу Т, поддерживатопему присваивание и копирование. Необязательный второй параметр шаблона определяет модель памяти (см. главу 15). По умолчанию используется модель allocator, определенная в стандартной библиотеке C-I-+*. Возможности векторов Элементы вектора копируются во внутренний динамический массив. Элементы всегда хранятся в определенном порядке; следовательно, вектор относится к категории упорядоченных коллекций. Вектор обеспечивает произволышй доступ к своим элементам. Это означает, что обрашение к любому элементу с известной позицией выполняется напрямую и с постоянным временем. Итераторы векторов являются итераторами произвольного доступа, что позволяет применять к векторам все алгоритмы STL. Операции присоединения и удаления элементов в конце вектора выполняются с высоки.м быстродействием. Если элементы вставляются или удаляются в середине и./1и в начале, быстродействие снижается, поскольку все элементы в последующих позициях приходится перемещать на новое место. На самом деле для каждого последующего элемента вызывается оператор присваивания. Один из способов повышения быстродействия векторов заключается в выделении для вектора большего объема памяти, чем необходимо для хранения всех элементов. Чтобы эффективно и правильно использовать векторы, нужно понимать, как связаны между собой размер и емкость вектора. Векторы поддерживают стандартные операции проверки размера size(), emptyO и nriax size() (см. с. 155). К ним добавляется функция capacltyO, возвращающая максимальное количество элементов, которые могут храниться в текущей выделенной памяти. Если количество элементов превысит значение, возвращаемое функцией capadtyO, вектору придется перераспределить свою внутреннюю память. Емкость вектора необходимо учитывать по двум причинам: О в результате перераспределения памяти становятся недействительными все ссылки, указатели и итераторы элементов вектора; О на перераспределение памяти требуется время. Следовательно, если программа поддерживает указатели, ссылки или итераторы для вектора, а также при важности быстродействия нужно помнить о емкости вектора. В системах, не поддерживающих зггачепия по умолчанию для параметров шаблонов, второй параметр обычно отсутствует.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |