Шаг 118.
Библиотека STL.
Элементы контейнеров. Требования к элементам контейнеров
На этом шаге мы перечислим требования к элементам контейнеров.
Элементы контейнеров должны удовлетворять ряду требований, потому что контейнеры работают с ними по определенным правилам.
Здесь мы рассмотрим требования, предъявляемые к элементам. Кроме того, мы разберемся, к каким последствиям приводит создание
контейнером внутренних копий элементов.
Требования к элементам контейнеров
Контейнеры, итераторы и алгоритмы STL оформлены в виде шаблонов. Это означает, что они могут работать с любыми типами,
как заранее определенными, так и пользовательскими. Впрочем, специфика выполняемых операций накладывает ряд требований на
элементы контейнеров STL. Таких требований три.
- Требуется возможность копирования элемента копирующим конструктором. Созданная копия должна быть эквивалентна
оригиналу. Это означает, что любая проверка на равенство должна считать копию и оригинал равными, а поведение копии не должно
отличаться от поведения оригинала.
Все контейнеры создают внутренние копии своих элементов и возвращают их временные копии. Копирующий конструктор вызывается
очень часто, поэтому он должен обладать хорошим быстродействием (это не требование, а всего лишь условие, повышающее
эффективность работы контейнера). Если копирование объектов занимает слишком много времени, попробуйте предотвратить
копирование, используя контейнер со ссылочной семантикой.
- Требуется возможность присваивания элемента оператором присваивания. Контейнеры и алгоритмы используют оператор
присваивания для замены старых элементов новыми.
- Требуется возможность уничтожения элемента деструктором. Контейнеры уничтожают свои внутренние копии элементов при
удалении этих элементов из контейнера. Следовательно, деструктор не должен быть закрытым (private). Кроме того, как
обычно в C++, деструктор не должен инициировать исключения, иначе возможны абсолютно непредсказуемые последствия.
Эти три операции - копирование, присваивание, уничтожение - автоматически генерируются для любого класса. Следовательно, любой
класс автоматически удовлетворяет требованиям, если для него не были определены специальные версии этих операций или их
нормальная работа не нарушается другими членами класса.
Кроме того, к элементам могут предъявляться дополнительные требования.
- Для некоторых функций классов последовательных контейнеров требуется конструктор по умолчанию. Например, можно
создать непустой контейнер или увеличить количество элементов без указания значений новых элементов. Такие элементы создаются
вызовом конструктора по умолчанию для соответствующего типа.
- Для некоторых операций требуется определить проверку на равенство оператором ==. Такая необходимость особенно часто
возникает при поиске.
- Для ассоциативных контейнеров требуется, чтобы элементы поддерживали критерий сортировки. По умолчанию используется
оператор <, вызываемый объектом функции less<>.
На следующем шаге мы рассмотрим семантику значений.
Предыдущий шаг
Содержание
Следующий шаг