Головна

Послідовні контейнери | Асоціативні контейнери | Set <int> intSet; // створює множину значень int | Адаптери контейнерів | Алгоритми | Ітератори | До програми включений заголовочний файл ALGORITHM. В цьому файлі містяться оголошення алгоритмів STL. | Функціональні об'єкти | Черги з двостороннім доступом | Ітератори як інтелектуальні вказівники |

Додавання _if до аргументів

  1. Додавання і віднімання матриць
  2. Обертання запису й додавання луни
  3. Основні властивості додавання та віднімання матриць
  4. Письмове додавання і віднімання
  5. Правила додавання,множення,формули включень та виключень
  6. Правило множення, правило додавання, формула включень та виключень.

Деякі аргументи мають версії з закінченням _if. Їм потрібний додатковий параметр, який називається предикатом і є функціональним об'єктом чи функцією. Наприклад, алгоритм find() знаходить всі елементи, рівні вказаному значенню. Можна написати функцію, яка працює з алгоритмом find_if() і знаходить елементи з якимись додатковими параметрами.

В прикладі 26.8 використовуються об'єкти класу string. Алгоритму find_if() передається функція користувача isDon, щоб можна було знайти перший рядок в масиві, що має значення Ivan

#include<iostream>

#include<conio>

#include<string>

#include<algorithm>

using namespace std;

bool isDon(string name)

{return name=="Ivan";}

string names[]={"Sergij","Andrij","Ulana","Tetana","Ivan","Ivanna"};

int main()

{string* ptr;

ptr=find_if(names,names+5,isDon);

if(ptr==names+5)

cout<<"Ivana nemae v spysku\n";

else

cout<<"Ivan zapysanyj v pozycii "

<<(ptr-names)

<<" v spysku \n";

getch();

return 0;

}

Програма 26.8

Адреса функції isDon() - третій елемент алгоритму find_if(), а перші два, як звичайно, задають діапазон пошуку від початку до «післяостаннього» елементу масиву.

Алгоритм find_if() застосовує функцію is_Don() до кожного елементу з діапазону. Якщо is_Don() повертає true для якого-небудь елемента, то find_if() повертає значення ітератора для цього елементу. В протилежному випадку повертається вказівник на адресу «Післяостаннього» елементу масиву.

_if-версії є також в інших алгоритмів, наприклад, count(), replace(), remove().

Алгоритм for_each()

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

В прикладі 26.9 for_each() використовується для переведення всіх значень масиву з дюймів у сантиметри і виведення їх на екран. Ми пишемо функцію in_to_cm(), яка просто множить значення на 2.54, і передаємо адресу цієї функції в якості третього аргументу алгоритму.

#include<iostream>

#include<conio>

#include<algorithm>

using namespace std;

void in_to_cm(double); //оголошення

int main()

{double inches[]={3.5,6.2,1.0,12.75,4.33};

for_each(inches,inches+5,in_to_cm);

cout<<endl;

getch();

return 0;

}

//---

void in_to_cm(double in)

{cout<<(in*2.54)<<' ';}

Програма 26.9

Результати роботи програми виглядають так:

Алгоритм transform()

Цей алгоритм теж виконує якусь дію з кожним елементом трансформера, але ще й поміщає результат в інший або той сам контейнер. Функція користувача визначає, що саме робити з даними, причому тип повернутого нею результату повинен відповідати типу цільового контейнера. Приклад 26.10 аналогічний до попереднього, але замість виводу на екран функція in_to_cm() виводить значення сантиметрів в новий масив centi[], а потім головна програма виводить вміст цього масиву.

#include<iostream>

#include<conio>

#include<algorithm>

using namespace std;

int main()

{double inches[]={3.5,6.2,1.0,12.75,4.33};

double centi[5];

double in_to_cm(double); //оголошення

transform(inches,inches+5,centi,in_to_cm);

for(int j=0;j<5;j++)

cout<<centi[j]<<' ';

cout<<endl;

getch();

return 0;

}

//---

double in_to_cm(double in)

{return(in*2.54);}

Програма 26.10

Результати роботи програми виглядають так:

Ми розглянули деякі алгоритми STL. Є ще багато інших, але тепер зрозуміло, як вони працюють і як з ними поводитися.

4. ПОСЛІДОВНІ КОНТЕЙНЕРИ

Є дві основні категорії контейнерів: послідовні та асоціативні. Далі ми розглянемо три послідовні контейнери (вектори, списки і черги з двостороннім доступом), обговорюючи, як працює кожен з них і які вони містять методи.

Слід пам'ятати, що різні види контейнерів використовують методи з одинаковими іменами і характеристиками, тому, наприклад, метод push_back() для векторів працюватиме також зі списками й чергами.



Функції користувача замість функціональних об'єктів | Вектори
© um.co.ua - учбові матеріали та реферати