Важно заметить сходство между вызовами
sort (v. begin)) , v.endO);
в программе sortl.cpp и
sort(a, a+n);
в программе sortl.cpp. В обоих случаях первый аргумент ссылается на первый элемент последовательного контейнера, а второй - на элемент, следующий за последним, точнее на позицию, находящуюся непосредственно после последнего элемента. Это общий принцип, справедливый не только для алгоритма sort, но и для большинства алгоритмов STL. Мы можем применить этот принцип также и к заданной подпоследовательности. Например, мы можем отсортировать только элементы а[3], а[4], а[5] и а[6], написав
sort(а+3, а+7); или, что эквивалентно,
|
Рисунок 1.2. Сортировка подпоследовательности |
sort[&a[3], &а[7]); как показывает рисунок 1.2.

Может показаться более логичным передавать адрес последних элементов, а не следующих за ними, в этом примере а[6] вместо а[7]. Однако использование элементов, следующих за последним, имеет несколько преимуществ. Например, мы можем определить количество элементов с помощью простого вычитания:
количество элементов = 7-4 = 3
Принятое соглашение также позволяет нам написать цикл for.
for (i=3; i!=7; ++i) ...
если мы хотим сделать что-либо с отсортированными элементами. Возможность выбрать подпоследовательность применима и к контейнерам STL, таким как векторы. Например, если в программе sortl.cpp вектор v также содержит не менее семи элементов, отсортируем v[3], v[A], v[5] и у[6], написав
vector<int>::iterator i, j; i = v.begin () + 3 ; j = v.begin() + 7; sort(i, j ) ;
или просто
sort(v.begin() + 3, v.begin() + 7);
Такое использование оператора + рассмотрим более подробно в разделе 1.9.
Произвольный доступ, доступ по индексу и сортировка
Вы могли заметить, что в предыдущем обсуждении мы использовали выражения типа v[3], хотя v не является массивом, а определен как
vector<int> v;
Доступ по индексу возможен в этом случае, поскольку вектор является контейнером произвольного доступа, для которого определен operator[] доступа по индексу. Заметьте, однако, что мы не можем заменить v[3] на *(v + 3), потому что тип переменной v является классом, для которого не определен ни бинарный оператор +, ни унарный оператор *.
Алгоритм STL sort требует произвольного доступа. Поскольку такой доступ обеспечивают векторы и массивы, мы могли использовать этот алгоритм в программах sortl
<< назад вперед >>