Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
###Cpp_лкц1_1.09_11_#дляБАК#29_01_12.doc
Скачиваний:
63
Добавлен:
29.04.2019
Размер:
6.42 Mб
Скачать

Глава 14. Алгоритмы

355

Рассмотрим пример, в котором выполняется копирование вектора а в новый вектор b (используется итератор вставки) с заменой всех элементов, лежащих в диапазоне от 10 до 50, на значение 33:

#include <iostream> #include <vector> #include <algorithm> using namespace std; bool In_10_50(int x){ return x >10 && x < 50;

}

int main(){

vector<int> a. v;

vector<int>: .-iterator i;

for (int k = 1: k < 10; k++)a.push_back(k * 10);

for (i = a.beginO; i != a.endO; i++) cout « *i « " ";

cout « endl;

replace_copy_i f(a.begi n(), a.end(),

inserter(v, v.beginO). In_10_50. 33);

for (i = v.beginO; i != v.endO: i++) cout « *i « " ";

cout « endl;

return 0;

} Результат работы программы (в первой строке исходный вектор, во второй — результирующий):

10 20 30 40 50 60 70 80 90 10 33 33 33 50 60 70 80 90

reverse, reverse_copy

Алгоритм reverse изменяет порядок следования элементов последовательности на обратный, a reverse_copy выполняет копирование исходной последовательности в результирующую в обратном порядке:

tempiate<class Bi>

void reverse(Bi first. Bi last): tempiate<class Bi. class Out>

Out reverse_copy(Bi first. Bi last. Out result);

rotate, rotate_copy

Алгоритм rotate выполняет циклическое перемещение элементов последовательности, a rotate_copy — копии последовательности:

tempiate<class For>

void rotate(For first. For middle. For last); tempiate<class For. class Out>

Out rotate_copy(For first. For middle. For last. Out result);

356

Часть III. Стандартная библиотека

Перемещение выполняется до тех пор, пока элемент, на который указывает второй параметр, не станет первым в последовательности. Первый и третий параметры задают начало и конец обрабатываемой последовательности. Например, для целочисленного массива int a[5] = {1.2,3,4,5} вызов rotate(a. а+2, а+5) приведет к тому, что элементы будут следовать в порядке 34512. Если после этого вызвать rotate(а, а+3. а+5), массив примет первоначальный вид.

transform

Алгоритм transform выполняет заданную операцию над каждым элементом последовательности. Первая форма алгоритма выполняет унарную операцию, заданную функцией или функциональным объектом ор, и помещает результат в место, заданное итератором result:

tempiate<class In, class Out. class 0p>

Out transformdn first. In last, Out result. Op op);

Вторая форма алгоритма выполняет бинарную операцию над парой соответствующих элементов двух последовательностей и помещает результат в место, заданное итератором result:

tempiate<class Inl, class In2, class Out, class BinaryOperation> Out transformdnl firstl. Inl lastl.

In2 first2. Out result. BinaryOperation binary_op);

Функциональный объект может быть стандартным или заданным пользователем. Пользовательский функциональный объект должен быть потомком una гу_

function или binary_function (см. с. 334).

В приведенном ниже примере первый вызов transform выполняет преобразование массива а по формуле: а-х = а{2 - Ь2, второй вызов меняет знак у элементов массива b с помощью стандартного функционального объекта negate.

#include <iostream> #include <algorithm> #include functional> using namespace std:

struct preobr: binary_function <double. double. double>{ double operatorO(double x. double y) const{ return x * x - у * у:}

}:

int main(){

const int m = 5;

double a[m] = {5. 3. 2-. 3. 1}.

b[m] = {1, 10, -3, 2. -4};

transforms. a + m. b. a. preobrO);

transforms. b + m, b. negate<double>0):

int i:

for (i = 0; i<m; i++) cout « a[i] « " ";

cout « endl;

for (i = 0; i<m; i++) cout « b[i] « " ";