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, которая позволяет нам задать функцию сравнения в виде аргумента.
<< назад вперед >>