|
Программирование >> Немодифицирующие последовательные алгоритмы
int main О { priority queue <int, vector<int>, CompareLastDigits> P; int x; P.push(123); P.push(51); P.push(lOOO); P.push(17); while (IP.emptyO) { X = P.topO; cout Retrieved element: x endl; P.popO ; return 0; Вывод этой программы содержит добавленные целые числа 123, 51, 1000, 17 в порядке возрастания их последних цифр (О < 1 < 3 < 7): Retrieved element: 1000 Retrieved element: 51 Retrieved element: 123 Retrieved element: 17 Отметим, что нам необходимо использовать функциональный объект, поскольку шаблон priority queue требует в качестве третьего параметра тип. Этот тип определяет идентификатор CompareLastDigits. Сравнение X % 10 > у % 10 содержит оператор >, в результате чего элемент с наименьшей последней цифрой предшествует другим элементам. Аналогичным образом при использовании greaer<m> первым будет располагаться наименьший элемент. функциональные объекты и адаптеры 6.2. Функциональные объекты В разделах 1.12 и 2.4 уже рассмотрены функциональные объекты, которые зачастую бывают трудны для восприятия, поэтому мы немного поэкспериментируем с ними вне рамок STL. Следующая программа демонстрирует класс sq, который можно использовать для вычисления значения целого числа X. II funobjl.cpp: Простой функциональный объект. #include <iostream.h> struct sq { int operator()(int x)const {return x * x;} int mainO { cout 5*5= sq()(5) endl; 25 return 0; Ключевое слово struct часто используется вместо class, когда класс имеет только открытые (public) члены. Если не считать доступ по умолчанию (закрытый (private) для class и открытый для struct), эти два ключевых слова эквивалентны. Из раздела 1.12 известно, что выражение sqQ вызывает конструктор по умолчанию класса sq, так что значение этого выражения является экземпляром этого класса. Строка int operator!)(int х) {return х * х;} в этом классе определяет operatorQ таким образом, что выражение sqQ(5) является разрешенным вызовом функции, результат которого равен 25. Важно понимать, чем отличаются следующие выражения: sq класс (тип), который мы будем называть функциональным классом; sqQ функциональный объект; 5(70(5) вызов функции. Функциональные объекты обладают всеми свойствами обычных функций, но они имеют дополнительные возможности, как показывает следующая программа: funobj2.cpp: Функциональные классы как параметры шаблона, ♦include <iostream.h> struct square { int operator0 (int x)const {return x * x;} struct cube { int operator 0 (int x)const {return x * x * x;} template <class T> class cont { public: cont(int i): j(i){} void printOconst {cout T()(j) endl;} private: int j ; int mainO { cont<square> numsq(lO); numsq.print 0; Вывод: 100 cont<cube> numcub(lO); numcub.print(); Вывод: 1000 return 0;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |