Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП.doc
Скачиваний:
77
Добавлен:
07.03.2016
Размер:
1.78 Mб
Скачать

Void main()

{

vector<int> a;

int i;

for (i = 1; i<10; i++) a.push_back(i*10);

for (i = 0; i <a.size(); i++) cout << a[i] << " ";

cout << endl;

vector<int>::iterator new_end =

remove_if(a.begin(), a.end(), In);

a.erase(new_end, a.end());

for (i = 0; i< a.size(); i++) cout << a[i] << " ";

cout << endl;

}

Результат роботи програми:

10 20 30 40 50 60 70 80 90

10 50 60 70 80 90

Алгоритми replace, replace_if, replace_copy, replace_copy_if.

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

#include <iostream>

#include <algorithm>

#include <vector>

using namespace std;

bool In (int x) {return x > 10 && x < 50;}

Void main()

{

vector<int> a, v;

vector<int>::iterator i;

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

for (i = a.begin(); i != a.end(); i++)cout<<*i<<" ";

cout << endl;

replace_copy_if(a.begin(), a.end(),

inserter(v, v.begin()), In,33);

for (i = v.begin(); i != v.end(); i++)cout<<*i<<" ";

cout << endl;

}

Результат роботи програми:

10 20 30 40 50 60 70 80 90

10 33 33 33 50 60 70 80 90

Алгоритм transform. У приведеному нижче прикладі перший виклик transform виконує перетворення масиву а по формулі: ai = аi – bi, другий виклик змінює знак у елементів масиву b за допомогою стандартного функціонального об'єкту negate.

#include <iostream>

#include <algorithm>

#include <functional>

using namespace std;

struct preobr: binary_function <double,double,double>

{

double operator()(double x, double y) const

{

return x * x - y * y;

}

};

Void main()

{

const int m = 5;

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

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

transform(a, a + m, b, a, preobr());

transform(b, b + m, b, negate<double>());

int i;

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

cout << endl;

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

cout<< endl;

}

Результат роботи програми:

24 -91 -5 5 -15

-1 -10 3-2 4

11.3.3 Алгоритми, пов'язані з сортуванням

Алгоритми цієї категорії упорядковують послідовності, виконують пошук елементів, злиття послідовностей, пошук мінімуму і максимуму, лексикографічне порівняння, перестановки тощо.

Таблиця 11.5. Алгоритми, пов'язані з сортуванням

Алгоритм

Виконувана функція

binary_search

Пошук заданого значення

equal_range

Знаходження послідовності елементів із заданим значенням

lnplace_merge

Злиття відсортованих послідовностей одного діапазону

lexicographical_compare

Лексикографічно перша з двох послідовностей

lower_bound

Знаходження першого входження заданого значення

max

Більше з двох значень

max_element

Найбільше значення в послідовності

merge

Злиття відсортованих послідовностей

min

Менше з двох значень

min_element

Найменше значення в послідовності

next_permutat1on

Наступна перестановка в лексикографічному порядку

nth_element

Поміщення n-го елементу на задане місце

partial_sort

Часткове сортування

partial_sort_copy

Часткове сортування з копіюванням

partition

Переміщення вперед елементів, що задовольняють умові

Продовження таблиці 11.5

Алгоритм

Виконувана функція

prev_permutation

Попередня перестановка в лексикографічному порядку

sort

Сортування

stable_partition

Переміщення вперед елементів, що задовольняють умові, із збереженням їх відносного порядку

stable_sort

Сортування, що зберігає порядок для однакових елементів

upper_bound

Знаходження першого елементу, більшого, ніж задане значення

Розглянемо приклади використання деяких алгоритмів. Для кожного з алгоритмів існує дві форми: одна використовує операцію "<", а інша – функцію порівняння, задану користувачем. Багатьом алгоритмам потрібні ітератори довільного доступу.

Алгоритм lexicographical_compare. Він виконує поелементне порівняння двох послідовностей або з використанням операції "<", або за допомогою заданої функції соmр. Повертається true, якщо перша послідовність лексикографічно менше другої (тобто черговий елемент першої послідовності опинився менше відповідного елементу другої), і false в іншому випадку. Якщо довжини послідовностей не збігаються, елементи, яких бракує вважаються меншими відповідних елементів іншої послідовності.

Приклад:

#include <iostream>

#include <algorithm>

#include <functional>

using namespace std;