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

1 ... 43 44 45 [ 46 ] 47 48 49 ... 239


Спасибо Джону Спайсеру (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, вектору придется перераспределить свою внутреннюю память.

Емкость вектора необходимо учитывать по двум причинам:

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

О на перераспределение памяти требуется время.

Следовательно, если программа поддерживает указатели, ссылки или итераторы для вектора, а также при важности быстродействия нужно помнить о емкости вектора.

В системах, не поддерживающих зггачепия по умолчанию для параметров шаблонов, второй параметр обычно отсутствует.



1 ... 43 44 45 [ 46 ] 47 48 49 ... 239

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