Программирование >>  Немодифицирующие последовательные алгоритмы 

1 ... 31 32 33 [ 34 ] 35 36 37 ... 78



Ассоциативные контейнеры

4.1. Введение

Из раздела 2.5 мы узнали, что существуют четыре типа ассоциативных контейнеров: множества, множества с дубликатами, словари и словари с дубликатами. Множества и множества с дубликатами характеризуются двумя параметрами шаблона, а словари и словари с дубликатами - тремя:

template <class Key, class Compare>

class set { ...

template <class Key, class Compare>

class multiset { ...

template <class Key, class T, class Compare>

class map { ...

template <class Key, class T, class Compare>

class multimap { ...

Полностью определения этих шаблонных классов помещены в заголовках set и тар.



О переносимости

Если вы используете старую версию HP STL, вам придется включать заголовки set.h и map.h для множеств и словарей, а для вариантов этих контейнеров с дубликатами - соответственно multiset.h и multimap.h.

Сравнение и прочие функциональные объекты

Программисты, начинающие изучать STL, могут посчитать функциональные объекты трудными для понимания. Это отчасти вызвано применением сложных конструкций языка С++, которые редко используются большинством программистов. В дополнение к нашему обсуждению в разделе 1.12 рассмотрим эту тему более подробно. Начнем с напоминания, что выражение

into

имеет в качестве значения целочисленную константу О, отсюда следует, что два нижеприведенных выражения эквивалентны:

X = 0;

х = int();

Для нестандартного типа, например Т, выражение Г() возвращает объект типа Т, как показывает следующая программа:

/ / gen t. срр: Создаем объект ТО. iinclude <iostream.h>

class Т { public:

T(){i = 123;}

int i;

int mainO

{ int j = T 0.i;

cout j endl; Вывод: 123

return 0;

Вспомним, что, если за именем типа (в нашем примере это Т в функции main) следует пара круглых скобок без параметров, это приводит к вызову конструктора по умолчанию для создания объекта. Конструктор по умолчанию не имеет параметров, либо все его параметры имеют значение по умолчанию. В этом примере мы определяем такой конструктор для класса Т. Если бы мы этого не сделали, а также не определили бы никаких других конструкторов для Т, компилятор создал бы за нас конструктор по умолчанию, эквивалентный Т{){).



По-другому обстоят дела, когда круглые скобки следуют не за именем типа, а после объекта; например, когда для объекта и типа U мы используем выражения вроде следующих:

и(1, 2, 3)

Оба этих выражения разрешены только в том случае, если мы определяем соответствующие операторы вызова функции, описываемые как operatorQ, например:

са11 ор.срр: Два оператора вызова.

♦include <iostream.h>

class и { public:

char operator()()

{ return Q;

int operator()(int a, int b, int c)

{ return a + b + c;

int mainO { и u;

cout u() = u() endl;

cout u(l, 2, 3) = u(l, 2, 3) endl;

return 0;

Результат этой программы следующий: u() = Q

u(l, 2, 3) = б

В программе calljop.cpp определены два оператора вызова. Первый не имеет параметров и возвращает тип char, а второй принимает три параметра и возвращает тип int.

Схожесть выражений Г() и м() в двух наших последних программах обманчива. Поскольку Т- это тип, а и - объект, выражение Г() стоит ближе по смыслу к выражению и, когда Т сопровождается скобками, а и нет; как Т(), так и и являются объектами. Если бы мы определили для класса Гте же операторы вызова, что и для U, тогда выражения

ТО (1, 2, 3) имели бы смысл.



1 ... 31 32 33 [ 34 ] 35 36 37 ... 78

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