|
Программирование >> Немодифицирующие последовательные алгоритмы
В следующей программе LessThan является типом, как Т в предыдущем обсуждении, и поэтому LessThanQ представляет собой объект, а LessThan(){2, 3) обозначает вызов функции: lessthan.cpp: Функциональный объект LessThan. iinclude <iostream.h> class LessThan { public: int operator!)(int x, int y) { return X < y; int mainO { LessThan b; cout b(2, 3) = b(2, 3) endl; cout LessThan0 (2, 3) = LessThan()(2, 3) endl; return 0; Эта программа печатает b(2, 3) = 1 LessThanО (2, 3) = 1 Мы использовали класс LessThan для сравнения целых чисел. Можно сделать этот класс более общим, определив шаблонный класс lessjthan для сравнения двух объектов, принадлежащих к одному типу, для которого определен оператор <, как в следующей программе: lt templ.cpp: Шаблонный класс для сравнения по условию меньше . iinclude <iostream.h> template <class Т> class less than { public: int operator!)(const T &x, const T &y) { return x < y; int mainO { less than<int> b; cout b(2, 3) = b(2, 3) endl; cout less than<double>()(2.1, 2.2) = less than<double>() (2 .1, 2.2) endl; return 0; Результат программы: Ь(2, 3) = 1 less than<double>()(2.1, 2.2) = 1 В последней строчке less than<double> является типом, а less than<double>0 -объектом этого типа. Наконец, less than<double>{) (2.1,2.2) является вызовом функции-члена operatorQ этого объекта. Все это облегчит понимание выражений наподобие settype SI(less<int>()) ; которые встретятся нам в следующем разделе. Приведенный пример является определением переменной 51. В этом определении объект less<int>Q (типа less<int>) передается в качестве параметра конструктору класса, settype. 4.2. Функции-члены множеств У класса set имеются три конструктора, которые могут быть определены следующим образом внутри класса: set (const Compare& comp = CompareO); 1 (no умолчанию) set(const value type* first, const value type* last, const Compare& comp = CompareO); 2 set(const set<Key, Compare>& x); 3 (копирования) Идентификатор Compare в приведенных объявлениях обозначает параметр шаблона, который является типом. Как мы показали в предыдущем разделе, это означает, что CompareQ является объектом. Следующая программа использует все три конструктора: setconst.срр: Конструкторы для множеств. ♦include <iostream> ♦include <set> using namespace std; typedef set<int, less<int> > settype; void out(const char *s, const settype &S) { cout s; copy (S.begin0 , S.endO, ostream iterator<int>(cout, )); cout endl; int mainO { int a[3] = {20, 10, 20); settype SI; 1 settype S2(а, а+3); 112 settype S3(S2); 3 out( SI: , SI) out( S2: , S2) out( S3: , S3) return 0; Несмотря на то что для конструирования 52 используется диапазон [а, а + 3) из трех элементов, в множество попадают только значения а[0] и а[1], из-за того что значение третьего элемента массива, а[2], равно а[0]. Вывод программы: S2: 10 20 S3: 10 20 Аргумент, задающий функцию сравнения, нами опущен, поэтому используется значение по умолчанию less<mt>{). Другими словами, программа имела бы то же самое действие, если бы мы написали: settype Sl(less<int>()); 1 settype S2(a, a+3, less<int>()); 2 Обратите внимание, что третий конструктор (помеченный комментарием 3) является конструктором копирования, который используется не только для инициализации переменных, но и для копирования аргументов (если значения передаются не по ссылке), и в операторе return. Следующие две функции-члена возвращают функциональный объект для сравнения элементов множества. Оба типа key compare и valuecompare являются синонимами параметра Compare шаблонного класса set. key compare key comp() const; value compare value comp() const; Приведенный ниже пример, хотя и не является слишком реалистичным, показывает применение этих функций: cout settype::value compare()(2, 3) = settype::value compare()(2, 3) endl; Если бы мы вставили такое непривычное выражение в функцию main программы setconst.cpp, то получили бы следующую строчку на выводе: settype::value compare()(2, 3) = 1 Перечисленные ниже функции-члены аналогичны по своему назначению одноименным функциям последовательных контейнеров:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |