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

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


В следующей программе 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

Перечисленные ниже функции-члены аналогичны по своему назначению одноименным функциям последовательных контейнеров:



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

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