Важно заметить сходство между вызовами

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


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