Имеется диапазон элементов, которые требуется отсортировать.
Для сортировки диапазонов имеется целый набор алгоритмов. Можно выполнить обычную сортировку (в восходящем или нисходящем порядке) с помощью sort
, а можно использовать одну из других функций сортировки, таких как partial_sort
. Посмотрите на пример 7.6, показывающий как это сделать#include
#include
#include
#include
#include
#include
#include
#include "utils.h" // Для printContainer(): см. 7.10
using namespace std;
int main() {
cout << "Введите набор строк: ";
istream_iterator
istream_iterator
vector
// Стандартный алгоритм sort сортирует элементы диапазона. Он
// требует итератор произвольного доступа, так что он работает для vector.
sort(v.begin(), v.end());
printContainer(v);
random_shuffle(v.begin(), v.end()); // См. 7.2
string* arr = new string[v.size()];
// Копируем элементы в массив
copy(v.begin(), v.end(), &arr[0]);
// Сортировка работает для любого типа диапазонов, но при условии, что
// ее аргументы ведут себя как итераторы произвольного доступа.
sort(&arr[0], &arr[v.size()]);
printRange(&arr[0], &arr[v.size()]);
// Создаем список с такими же элементами
list
lst.sort(); // Самостоятельная версия sort работать не будет, здесь требуется
// использовать list::sort. Заметьте, что невозможно отсортировать
// только часть списка.
printContainer(lst);
}
Запуск примера 7.6 может выглядеть вот так.
Введите набор строк: a z b y c x d w
^Z
-----
a b c d w x y z
-----
w b y c a x z d
-----
a b c d w x y z
-----
a b c d w x y z
Сортировка — это очень часто выполняющаяся операция, и есть два способа отсортировать последовательность. Можно обеспечить хранение элементов в определенном порядке с помощью ассоциативного контейнера, но при этом длительность операции вставки будет иметь логарифмическую зависимость от размера последовательности. Либо можно сортировать элементы только по мере надобности с помощью sort
Стандартный алгоритм sort
operator<
. Он объявлен вот так.void sort(Rnd first, Rnd last);
void sort(Rnd first, Rnd last, BinPred comp);
Как и в большинстве других алгоритмов, если operator<
Если требуется, чтобы одинаковые элементы сохранили свой первоначальный порядок, используйте stable_sort
Однако sort
deque
, vector
и string
/wstring
(которые не являются контейнерами, но удовлетворяют большинству требований к ним), list
— это единственный, который такого итератора не предоставляет. Если требуется отсортировать список, используйте list::sort
. Например, в примере 7.6 вы, вероятно, заметили, что list::sort
не принимает никаких аргументов.lst.sort();