I. Операції, що не модифікують.
for_earch() виконує операції для кожного елемента послідовності
find() знаходить перше входження значення в послідовність
find_if() знаходить першу відповідність предикату в послідовності
count() підраховує кількість входжень значення в послідовність
count_if() підраховує кількість виконань предиката в послідовності
search() знаходить перше входження послідовності як підпослідовності
search_n() знаходить n-і входження значення в послідовність
II. Операції, що модифікують.
copy() копіює послідовність, починаючи з першого елемента
swap() міняє місцями два елементи
replace() заміняє елементи із зазначеним значенням
replace_if() заміняє елементи при виконанні предиката
replace_copy() копіює послідовність, заміняючи елементи із зазначеним значенням
replace_copy_if() копіює послідовність, заміняючи елементи при виконанні предиката
fill() заміняє всі елементи даним значенням
remove() видаляє елементи з даним значенням
remove_if() видаляє елементи при виконанні предиката
remove_copy() копіює послідовність, видаляючи елементи із зазначеним значенням
remove_copy_if() копіює послідовність, видаляючи елементи при виконанні предиката
reverse() міняє порядок проходження елементів на зворотний
random_shuffle() переміщає елементи відповідно до випадкового рівномірного розподілу (“тасує” послідовність)
transform() виконує задану операцію над кожним елементом послідовності
unique() видаляє рівні сусідні елементи
unique_copy() копіює послідовність, видаляючи рівні сусідні елементи
III. Сортування.
sort() сортує послідовність із гарної середньої ефективністю
partial_sort() сортує частину послідовності
stable_sort() сортує послідовність, зберігаючи порядок слідування рівних елементів
lower_bound() знаходить перше входження значення у відсортованій послідовності
upper_bound() знаходить перший елемент, більший чим задане значення
binary_search() визначає, є чи даний елемент у відсортованій послідовності
merge() зливає дві відсортовані послідовності
IV. Робота з множинами.
includes() перевірка на входження
set_union() об'єднання множин
set_intersection() перетинання множин
set_difference() різниця множин
V. Мінімуми й максимуми.
min() менше із двох
max() більше із двох
min_element() найменше значення в послідовності
max_element() найбільше значення в послідовності
VII. Перестановки.
next_permutation() наступна перестановка в лексикографічному порядку
pred_permutation() попередня перестановка в лексикографічному порядку
13.4. Зразок виконання роботи
З допомогою об’єкту типу string збережіть в списку наступні стрічки: один, шість, два, сім, три, вісім, чотири, дев’ять, п’ять, десять. Потім відсортуйте список і виведіть на екран вмістиме відсортованого списку. Використовуючи алгоритми STL: 1) підрахуйте в обраному елементі масиву типу string кількість символів в нижньому регістрі і виведіть це число на екран; 2) об’єднайте список і масив у єдиний контейнер vector і виведіть його елементи на екран.
#include "stdafx.h"
#include <iostream>
#include <string.h>
#include <conio.h>
#include <list.h>
#include <vector>
#include <algorithm>
#include <cctype>
using namespace std;
int main()
{ setlocale( LC_ALL,"Ukrainian" );
list<string> str;
str.push_back(string("один"));
str.push_back(string("шість"));
str.push_back(string("два"));
str.push_back(string("сім"));
str.push_back(string("три"));
str.push_back(string("вісім"));
str.push_back(string("чотири"));
str.push_back(string("девять"));
str.push_back(string("пять"));
str.push_back(string("десять"));
list<string>::iterator p=str.begin();
while (p!=str.end())
{
cout<<*p;cout<<" ";
p++;
}
cout<<endl;
str.sort();
list<string>::iterator pp=str.begin();
while (pp!=str.end())
{
cout<<*pp;cout<<" ";
pp++;
}
cout<<endl;
string a[2]; int ii=0;
while (ii!=3)
{
cout<<"Введiть стрiчку:";
cin>>a[ii];
ii++;
}
int i=count_if(a[1].begin(),a[1].end(), islower);
cout<<i<<"символiв введено в нижньому регiстрi";
vector<string> str1;
merge(str.begin(),str.end(),a,a+3,back_inserter(str1));
cout<<endl;
vector<string>::iterator t=str1.begin();
while (t!=str1.end())
{
cout<<*t;cout<< " ";
t++;
}
cout<<"Натиснiть будь-яку клавiшу!";
while(!kbhit());
}
Рис. 1. Реалізація програми
13.5. Індивідуальні завдання
1. Створити контейнер, що містить об'єкти користувацького типу. Тип контейнера вибирається відповідно до варіанта завдання.
2. Відсортувати його по спаданню елементів.
3. Переглянути контейнер.
4. Використовуючи відповідний алгоритм, знайти в контейнері елемент, що задовольняє заданій умові.
5. Перемістити елементи, що задовольняють заданій умові в іншій (попередньо порожній) контейнер. Тип другого контейнера визначається варіантом завдання.
6. Переглянути другий контейнер.
7. Відсортувати перший і другий контейнери по зростанню елементів.
8. Переглянути їх.
9. Одержати третій контейнер шляхом злиття перших двох.
10. Переглянути третій контейнер.
11. Підрахувати, скільки елементів, що задовольняють заданій умові, містить третій контейнер.
12.Визначити, є чи в третьому контейнері елемент, що задовольняє заданій умові.
Зауваження:
1. Для створення другого контейнера в програмі № 3 можна використати або алгоритм remove_copy_if, або визначити свій алгоритм copy_if, якого немає в STL.
2. Для пошуку елемента в колекції можна використати алгоритм find_if, або for_each, або binary_search, якщо контейнер відсортований.
3. Умови пошуку й заміни елементів вибираються самостійно й для них пишеться функція-предикат.
4. Деякі алгоритми можуть не підтримувати використовувані у вашій програмі контейнери. Наприклад, алгоритм sort не підтримує контейнери, які не мають ітераторів довільного доступу. У цьому випадку варто написати свій алгоритм. Наприклад, для стека алгоритм сортування може виконуватися в такий спосіб: переписати стек у вектор, відсортувати вектор, переписати вектор у стек.
5. Для порівняння елементів при сортуванні по зростанню використовується операція <, що повинна бути перевантажена в користувацькому класі. Для сортування по убуванню варто написати функцію comp і використати другу версію алгоритму sort.
Варіанти завдань
№ п/п |
Перший контейнер |
Другий контейнер |
Вбудований тип даних |
1 |
vector |
list |
int |
2 |
list |
deque |
long |
3 |
deque |
stack |
float |
4 |
stack |
queue |
double |
5 |
queue |
vector |
char |
6 |
vector |
stack |
string |
7 |
map |
list |
long |
8 |
multimap |
deque |
float |
9 |
set |
stack |
int |
10 |
multiset |
queue |
char |
11 |
vector |
map |
double |
12 |
list |
set |
int |
13 |
deque |
multiset |
long |
14 |
stack |
vector |
float |
15 |
queue |
map |
int |
16 |
priority_queue |
stack |
char |
17 |
map |
queue |
char |
18 |
multimap |
list |
int |
19 |
set |
map |
char |
20 |
multiset |
vector |
Int |
21 |
multimap |
map |
long |
22 |
queue |
stack |
float |
23 |
priority_queue |
set |
char |
13.6. Контрольні запитання
На які категорії поділяються алгоритми STL?
Яку бібліотеку слід підключити для роботи з алгоритмами STL?
Яка різниця між алгоритмами групи модифіковані операції з послідовностями і немодифіковані операції з послідовностями?
Які алгоритми сортування STL Ви знаєте? Наведіть приклад.
Яка різниця між алгоритмом count_if і count?
Для чого призначений алгоритм for_each?
Яка різниця між алгоритмами iter_swap, swap і swap_ranges?
Які алгоритми переміщення Ви знаєте? Наведіть приклад.
Література
1. Александреску А. Современное проектирование на С++. Серия С++ In-Depth. tType. 3 / А. Александреску – М.: Изд-ий дом "Вильямс", 2002. – 336 c.
2. Буч Г. Объектно-ориентированный анализ и проектирование с примерами на С++ / Г.Буч – М.: Бином, 1998. – 560 с.
3. Влиссидес Дж. Применение шаблонов проектирования. Дополнительные штрихи / Дж.Влиссидес – М.: Изд-ий дом "Вильямс", 2003. – 144 с.
4. Гамма Э. Приемы объектно-ориентированного программирования. Патерны проектирования / Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес – СПб.: Питер, 2004. – 366 с.
5. Кениг Э. Эффективное программирование на С++. Серия С++ In-Depth. tType. 2 / Э. Кениг, Б. Му – М.: Изд-ий дом "Вильямс", 2002. – 384 с.
6. Лафоре Р. Объектно-ориентированное программирование в С++. Классика Computer Science. 4-е изд. / Р.Лафоре – СПб.: Питер, 2005. – 924с.
7. Алексєєв В.І. Об’єктно-орієнтоване програмування: Методичні вказівки до виконання лабораторних робіт з курсу «Об’єктно-орієнтоване програмування» / Укл.: В. І. Алєксєєв, І. О. Пеняк // Львів: Видавництво Національного університету «Львівська політехніка», 2011. — 44 с.
8. Павловская Т.А. Програмирование на языке высокого уровня / Т.А.Павловская – СПб.:Питер, 2003, – 461с.:ил.
9. Шилдт Г. Искусство программирования на С++// Г.Шилдт – СПб.: БХВ-Петербург, 2005. – 496с.:ил.
10. Страуструп Б. Дизайн и эволюция С++//Б.Страуструп. Пер. с англ. –М.:ДМК Пресс; СПб.: Питер, 2006. – 448 с.:ил.
11. Лаптев В.В. С++. Объектно-ориентированое программирование. Задачи и упражнения/ В.В.Лаптев., А.В.Морозов, А.В.Бокова – СПб.:Питер, 2007.– 288с.:ил.
12. Павловская Т.А., Щупак Ю.А. С++. Объектно-ориентированное программирование: Практикум. – СПб.: Питер, 2005. – 265 с.
13. Страуструп Б. Язык программирования С++. – СПб.: Бином, 1999. – 991 с.
14. Халперн, Пабло. Стандартная библиотека С++ на примерах/ Пер. с англ. – М.: Изд. дом "Вильямс", 2001. – 336 с.
15. Шаллоуэй А., Тротт Д. Шаблоны проектирования. Новый подход к объектно-ориентированному анализу и проектированию. – М.: Изд-ий дом "Вильямс", 2002. – 288 с.
16. Шилдт, Герберт. Полный справочник по С++, 4-е изд./ Пер. с англ. – М.: Изд. дом "Вильямс", 2006. – 800 с.
1 7. Элджер Д. С++: библиотека программиста. – СПб.: Питер, 2000. – 320 с.
1 Застосування операторів "крапка" і "стрілка" для об'єктів відповідає їх застосуванню для структур і об'єднань.
2 "Правильне" закінчення означає виконання стандартної послідовності дій після завершення роботи.
3 Це випливає з умови задачі.
