1.8. Типы, определенные пользователем

До сих пор все контейнеры, которые мы использовали, содержали элемен­ты типа int. Кроме стандартных типов, таких как int, в контейнерах STL можно хранить типы, определенные пользователем. Так как вызов merge{...) в программе merge.cpp основан на операции сравнения «меньше чем» <, такой вызов для новых типов возможен, только если мы для этих типов определяем operator^. Покажем это на простом примере:

// merge2.срр: Объединяем записи,   используя имена //                        в качестве ключей.

#include <iostream> Mnclude <string> #include <algorithm> using namespace  std;

struct  entry   {

long nr;

char name[30];

bool operator<(const entry &b)const

{ return strcmp(name, b.name) < 0;

} };

int main()

{    entry a[3]   =  {{10,   "Betty"}, {11,   "James"}, {80,   "Jim"}}, b[2]   =  {{16,   "Fred"},

{20,   "William"}}, c[5],   *p; merge(a,   a+3,   b,   b+2,   c); for   (p=c;   p   !=  c+5;   p++)

cout  « p->nr <<   "   "   << p->name «  endl; cout <<  endl; return  0; }

Для работы программы существенно, что имена в каждом из массивов а и Ь располагаются в алфавитном порядке. Программа объединяет а и b в с (в соответствии с алфавитным порядком имен), как показывает результат программы:

10 Betty 16            Fred

11 James 80            Jim

20 William

Если бы мы хотели, чтобы числа шли в порядке возрастания, их нужно было бы перечислить в таком порядке в заданных массивах а и Ь и, кроме того, заменить определение оператора «меньше». Поскольку числа и так уже рас­положены в порядке возрастания в обоих массивах, нам остается только вместо функции-члена operator^ использовать следующую:

bool operatorx (const entry &b)   const

{    return nr  < b.r;

}

После этой модификации вывод программы будет содержать числа в восходящем порядке:

10 Betty

11 James 16 Fred

20 William 80 Jim

Функция operator^ не обязана быть членом класса entry. Иными словами, мы могли бы написать

struct entry  {

long nr;

char name[30]; };

bool operator<( const entry &a, const entry &b) const

{ return strcmp(a.name, b.name) < 0;

}

вместо того определения класса entry, которое приводится в программе merge2.cpp. Кстати, в разделе 7.3.7 мы увидим, что существует версия merge, которая позволяет нам задать функцию сравнения в виде аргумента.


<< назад вперед >>