•
sort
может упорядочивать любой стандартный контейнер любого элементарного типа; концепции сортировки, критерии сортировки контейнера и элементарный тип являются независимыми понятиями. Если бы мы должны были создать вектор объектов, расположенных в свободной памяти, элементы которого относятся к классу, выведенному из класса Object
с функцией-членом before
, определенной для вызова из функции vector::sort
, то должны были бы иметь более узкую версию функции sort
, поскольку сделали предположения о хранении, иерархии классов, доступных функциях-членах, порядке и т.д.•
Circle
является разновидностью класса Shape
) и параметризация (например, класс vector
выражает нечто общее для всех векторов независимо от типа элементов).•
sort
позволяет использовать разные типы элементов и виды контейнеров, но эти элементы должны поддерживать операцию <
(если нет, то следует использовать функцию sort
с дополнительным аргументом, задающим критерий сравнения), а контейнеры, которые мы собираемся упорядочивать, должны поддерживать итераторы с произвольным доступом.•
sort(b,e,op)
, сортирующей элементы с помощью оператора op
, существует вариант sort(b,e)
, выполняющий неявную сортировку с помощью отношения “меньше”. Если бы мы могли (или имели возможность использовать язык C++0x; см. раздел 22.2.6), то предусмотрели бы также версию sort(c)
для сортировки стандартного контейнера с помощью отношения “меньше” и функцию sort(c,op)
для сортировки стандартного контейнера с помощью оператора op
.22.1.2.4. Уровень абстракции
Рассмотрим, например, как представлены записи в телефонной книге, которая может храниться в вашем мобильном телефоне. Мы могли бы представить множество пар (имя, значение) с помощью класса vector
map
. Это позволит не писать (и отлаживать) функции доступа к записям. С другой стороны, класс vector>
сам по себе находится на более высоком уровне абстракции, чем два массива, string[max]
и Value_type[max]
, где отношение между строкой и значением носит неявный характер. На самом низком уровне абстракции могло бы находиться сочетание типа int
(количество элементов) и двух указателей void*
(ссылающихся на какую-то форму записи, известную программисту, но не компилятору). В нашем примере каждое из предложенных решений можно отнести к низкому уровню абстракции, поскольку в каждом из них основное внимание сосредоточено на представлении пар значений, а не на их функциях. Для того чтобы приблизиться к реальному приложению, следует определить класс, который непосредственно отражает способ его использования. Например, мы могли бы написать код приложения, используя класс Phonebook
с удобным интерфейсом. Класс Phonebook
можно было бы реализовать с помощью одного из описанных выше представлений данных.