: : i t e r a t o r p ;
c o u t << "Вывод неотсортированного вектора:\ n " ;
f o r ( p = k . b e g i n ( ) ; pc o u t << ∗p << ’ ’ ;
}
//Сортировка вектора.
s o r t ( k . b e g i n ( ) , k . end ( ) ) ;
c o u t << " \ nВывод отсортированного вектора:\ n " ;
f o r ( p = k . b e g i n ( ) ; p{
c o u t << ∗p << ’ ’ ;
}
c o u t << e n d l ;
}
Как видно, пример сначала заполняет вектор целых чисел четырьмя значе-
ниями, затем поэлементно выводит содержимое вектора на экран, сортирует с
Программирование на языке С++ в среде Qt Creator
10.7. Элементы стандартной библиотеки C++
325
использованием алгоритма sort, а затем снова выводит на экран. Вывод про-
граммы выглядит следующим образом:
Вывод неотсортированного вектора:
22 11 4 100
Вывод отсортированного вектора:
4 11 22 100
10.7.4
Алгоритмы
В состав стандартной библиотеки входит группа функций, выполняющих
некоторые стандартные действия, например поиск, преобразование, сортировку,
поштучный перебор элементов, копирование и т. д. Они называются алгоритма-
ми
. Параметрами для алгоритмов, как правило, служат итераторы. Алгоритму
нет никакого дела до типа переданного ему итератора, лишь бы итератор под-
падал под определённую категорию. Так, если параметром алгоритма должен
быть однонаправленный итератор, то подставляемый итератор должен быть ли-
бо однонаправленным, либо двунаправленным, либо итератором произвольного
доступа.
Например, алгоритм простого поиска find просматривает элементы подряд,
пока нужный не будет найден. Для такой процедуры вполне достаточно ите-
ратора ввода. С другой стороны, алгоритм более быстрого бинарного поиска
binary_search
должен иметь возможность переходить к любому элементу по-
следовательности, и поэтому требует итератора с произвольным доступом.
Многие алгоритмы получают в качестве параметра различные функции. Эти
функции используются для сравнения элементов, их преобразования и т. д. Од-
нако вызов функции по указателю — ресурсоёмкая операция. Вместо указателя
на функцию можно передать объект любого класса с перегруженным оператором
вызова функции operator(). Одно из преимуществ обращения к переопределён-
ному оператору вызова функции вместо собственно её вызова заключается в том,
что переопределённый оператор может быть реализован в классе как встроенная
функция, т. е. код оператора будет подставлен вместо вызова.
Рассмотрим пример алгоритма find, который находит первое вхождение за-
данного значения в коллекцию. Алгоритм принимает в качестве аргументов пару
итераторов и искомое значение; соответственно возвращается итератор, указы-
вающий на первое вхождение заданного значения. Благодаря универсальности
механизма итераторов, алгоритм будет работать со структурой любого типа, в
том числе и с обычными массивами языка C. Например, чтобы найти первое
вхождение числа 7 в массив целых, требуется выполнить следующий код, ис-
пользующий в качестве итераторов обычные указатели:
i n t data [ 1 0 0 ] ;
. . .
i n t ∗ where ;
where = f i n d ( data , data +100 , 7 ) ;
Поиск первого значения в целочисленном векторе выглядит приблизительно
так же:
© 2015 Алексеев Е. Р., Злобин Г. Г., Костюк Д. А., Чеснокова О. В., Чмыхало А. С.
326
Do'stlaringiz bilan baham: