Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lectures_2.doc
Скачиваний:
28
Добавлен:
15.03.2015
Размер:
511.49 Кб
Скачать

Алгоритмы

Это существенная часть библиотеки STL. Алгоритмы более всего похожи на обычную библиотеку. Основное отличие их от традиционной библиотеки они (алгоритмы) реализованы в виде шаблонов функций.

Алгоритмы – это внешние функции, работающие с итераторами. Преимущество такого подхода состоит в следующем. Вместо того, чтобы разрабатывать такой алгоритм для каждого вида контейнера, достаточно реализовать его один раз для обобщенного контейнера.

Следует отметить один важный факт. В основе использования алгоритмов лежит скорее парадигма процедурного программирования, а не парадигма объектно-ориентированного программирования. При работе с алгоритмами данные разделяются на части, взаимодействующие через некоторый интерфейс.

Один из недостатков такого подхода состоит в том, что некоторые комбинации данных и алгоритмов могут оказаться недопустимыми и еще хуже, допустимыми, но мало эффективными.

Алгоритм for_each

Формат.

template <typename InIter, typename UnaryFunction> void for_each(InIter first, InIter last, UnaryFunction f);

Алгоритм for_eachвызывает функциюfдля каждого элемента последовательности, задаваемой двумя итераторами [first,last). Здесьfтак называемая унарная функция. Унарная функция – это функция, принимающая один аргумент.

Пример 1. Имеется контейнер типа list<int>. Требуется организовать вывод элементов контейнера на дисплея с помощью алгоритмаfor_each.

#include<ostream> #include<list> #include<algoritm> using namespace std; void print(int x) { cout << x << ‘\t’; } int main() { int ar[] = {1, 3, 5, 7}; list<int> lst(ar, ar + n); for_each(lst.begin(), lst.end(), print); cout << endl; } // Вывод не экран дисплея 1 3 5 7

Проблема. Каким образом в случае необходимости передавать информацию в функцию f. Например, каким образом организовать вывод на экран дисплея не всех элементов контейнера, а только тех, которые удовлетворяют некоторому условию (например, только положительные элементы).

Выход из положения состоит в применение так называемых функциональных объектов.

Функциональные объекты

Функциональный объект – это экземпляр класса, в котором перегружен оператор функция: operator().

Пример 2. Дан контейнер типа list<int>. Вывести на экран дисплея элементы контейнера, значения которых не превышают величиныa.

// директивы препроцессора // Класс, экземпляры которого являются объект-функциями classprint_if{public:print_if(inta) :a_(a) { }voidoperator()(intvalue) {if(value<=a)cout<<value<< ‘\t’; }private:inta_; }; // Клиентский кодintmain() {inta; // Вводalist<int>lst; // Работа с контейнеромlst// Вывод с использованием алгоритмаfor_eachfor_each(lst.begin(),lst.end(),prinf_if(a)); // ... }

В третьем параметре алгоритма for_eachсоздается анонимный (без имени) объект, а ожидается вызов функции. Особенностью классаprint_ifявляется наличие перегруженного оператора функция:operator(). Наличие этого перегруженного оператора и принимает во внимание компилятор. При выполнении алгоритмаfor_eachв рассматриваемом примере для каждого элемента контейнераlstиз диапазона, задаваемого первым и вторым параметрами алгоритма, будет выполняться перегруженный оператор функция.

Соседние файлы в предмете Программирование