Программирование >>  Операторы преобразования типа 

1 ... 18 19 20 [ 21 ] 22 23 24 ... 239


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

namespace std {

template <class Т. class Compare>

inline const T& min (const T& a. const T& b. Compare comp) { return comp(b.a) ? b : a;

template <class T. class Compare>

inline const T& max (const T& a. const T& b, Compare comp) { return comp(a.b) ? b ; a;

В качестве дополнительного аргумента передается функция или объект функции, который проверяет, предшествует ли первая величина второй в некотором заданном порядке (объекты функций представлены на с. 134).

Пример использования функции тах() с передачей функции сравнения:

util/minmax.cpp #include <algorithm> using namespace std:

/* Функция сравнивает два указателя путем сравнения значений. * на которые они ссылаются */

bool lnt ptrjess (int* а, int* b)

return *a < *b:

int mainO

int X = 17; int у = A2: int* px &x; int* py = &y; int* pmax;

Вызов maxO с передачей функции сравнения

pmax = max (px, py, int ptr less):

...

Учтите, что определения min() и max() требуют совпадения типов. Следовательно, эти функции не могут использоваться для объектов разных типов:

int i: long 1:

1 = std::max(i.1): ОШИБКА: разнотипные аргументы



С другой стороны, вы можете явно задать типы аргументов (а следовательно, и возвращаемого значения):

1 = std::max<long>C1.l): OK

Перестановка двух значений

Функция swapO меняет местами значения двух объектов. Общая реализация swap() определяется в заголовочном файле <algorithm> следующим образом:

namespace std {

tempiate<class T>

inline void swapCT& a. TS b) {

T tnip{a);

a = b:

b = tmp;

Таким образом, чтобы поменять значения двух произвольных переменных х и у, можно воспользоваться вызовом

std:;swapCx,y):

Разумеется, этот вызов работает только в том случае, если в функции swap() возможно конструирование копий и присваивание.

Большим преимуществом 5wap() является то, что программист может определить специальную реализацию для более сложных типов посредством специализации шаблона или перегрузки функции. Специальные реализации экономят время, используя внутреннюю перестановку членов классов вместо присваивания объектов. В частности, такая возможность реализована во всех стандартных контейнерах (см. с. 153) и строках (см. с. 472). Например, реализация 5wap() для простого контейнера, содержащего только массив и количество элементов, выглядит примерно так:

class MyContainer { private:

int* elems: Динамический массив элементов int numElems; Количество элементов publi с:

Реализация swapC)

void swapCMyContainer& x) {

std: :swap{elenis.x.elems);

std::swap(numElems.x.numElems):

Перегрузка глобальной версии swapO для данного типа



inline void swap CMyContainer& cl. MyContainerS c2) {

cl.swap(c2): Вызов специальной реализации swapO

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

Вспомогательные операторы сравнения

Четыре шаблонные функции определяют операторы сравнения !=, >, <= и > = вызовом операторов == и <. Определения этих функций в заголовочном файле <utility> выглядят так:

namespace std (

namespace rel ops { template <class T>

inline bool operator != (const TS x. const T& y) { return !Cx -= y):

template <class T>

inline bool operator> (const T& x. const T& y) { return у < x:

template <c\ass T>

inline bool operator<= (const T& x. const T& y) { return !Cy < X):

template <class T>

inline bool operator>= (const T& x. const T& y) { return !(x < y):

Чтобы использовать эти функции, достаточно определить операторы < и ==. При включении пространства имен std::reLops другие операторы сравнения определяются автоматически. Пример:

#include <utility> class X {



1 ... 18 19 20 [ 21 ] 22 23 24 ... 239

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