|
Программирование >> Немодифицирующие последовательные алгоритмы
Ассоциативные контейнеры 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) имели бы смысл.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |