SlideShare a Scribd company logo
1 of 78
Download to read offline
АМО.L9
(L9.0)
Рівні проектування цифрових систем
• SW: Application
• SW: C++ Boost
• SW: C++ STL
• SW: C++11
• SW: C++
• SW: C
• SW: Assembler SW
------------------------------------------------------------------------------------------------------------------
• (TLM)HW: SystemC/SystemVerilog (Architecture, CE) HW
• (RTL)HW: VHDL/Verilog (Logic Circuit, CE)(1)
• HW: VHDL/Verilog (Logic Circuit, CE)(2)
• HW: SPICE/Verilog (Physical Design, EE)(1)
• HW: SPICE (Physical Design, EE)(2)
• HW: SPICE/GDSII (Physical Design, EE-PD) type-in
--------------------------------------------------------------------------------------------
• (DFM)HW: GDSII (Physical Design, EE-PD) type-out
A
||
||
||
||
||
||
||
||
||
||
||
||
||
||
||
||
Еволюція С++
Еволюція С++
АМО.L9
(L9.1)
БібліотекаБібліотека STLSTL
БібліотекаБібліотека STLSTL
• Бібліотека стандартних шаблонів (БСШ- STL- standart template library) не
входила у вихідну специфікацію С++, а була добавлена розробниками пізніше.
• БСШ забезпечує загальноцільові, стандартні класи і функції, реалізовує
найбільш важливі алгоритми і структури даних. Оскільки вона будується на
основі класів-шаблонів, алгоритми, які в неї входять, можуть бути застосовані
практично до будь-яких типів даних, які допускаються в С++.
• Використання засобів БСШ дозволяє суттєво підвищити надійність
програм, їх універсальність, а також суттєво зменшити терміни розробки програм.
• Ядро БСШ складають три основні елементи:
1. контейнери,
2. aлгоритми,
3. ітератори.
• Ці елементи взаємно функціонують, забезпечуючи при цьому вирішення
поставлених задач.
ДДодатковіодаткові методиметоди
• Додатково до контейнерів, алгоритмів та ітераторів у STL підтримується ще декілька стандартних
компонентів. Головними серед них є розподільники пам’яті (allocators), предикати
(predicates) та функції порівняння (comparison functions).
• У кожного контейнера є визначений для нього розподільник пам’яті або алокатор. Алокатори
керують процесом розподілу пам’яті. По замовчуванню розподільником пам’яті є об’єкт класу
allocator, який оголошений у ФЗ <memory.h>. Конструктор цього класу генерує виклик функції
побудованої на основі шаблону allocate з цього ж ФЗ. Наведемо прототип цієї функції-шаблону
 template <class T> inline T* allocate (int size, T*);
• Тут T - тип одного елемента-блока; size - кількість блоків. Повертає шаблон адресу виділеної через
оператор new пам’яті.
• У більшості випадків достатньо розподільника, який задається по замовчуванні,але можна
визначити і власний розподільник пам’яті.
• В деяких алгоритмах і контейнерах використовуються функції особливого типу, які називаються
предикатами. Предикат може бути бінарним або унарним. Унарний предикат має один аргумент,
бінарний- два. Аргументи бінарного предикату завжди розташовані по-порядку. Тип аргументів
предикатів відповідає типу об’єктів, які зберігаються в контейнері.
• Повертають предикати булівське значення. Проте точні умови повернення значення
предикатом повинні визначатись розробником. Як правило, існує два типи для оголошення
предикатів: UnPred - для унарного і BinPred- для бінарного.
• В деяких алгоритмах і класах використовується спеціальний тип бінарного предиката, який
призначений для порівняння двох елементів контейнера. Такий предикат називається функцією
порівняння. Функція порівняння повертає істину, якщо її перший аргумент менший за другий.
• Найбільш поширеним предикатом є функція порівняння двох елементів Comp, яка повертає true
при умові, що перший елемент менший за другий.
ККooнтейнеринтейнери
• Контейнери (containers) - це об’єкти, які призначені для зберігання інших об’єктів. Контейнери бувають різних
видів. Так у класі-шаблоні vector визначається динамічний масив, а в класі list - лінійний список. Загалом БСШ містить
контейнери, які реалізовують основні структури даних, які використовуються при написанні програм - вектори,
двонаправлені черги, списки і ії різновиди, словники (пари) і множини.
• Умовно контейнери можна розбити на два типи: послідовні і асоціативні.
• Послідовні контейнери (serial containers) забезпечують зберігання скінченного числа однотипних елементів у
вигляді неперервної послідовності. До таких контейнерів відносять вектори, двонаправлені черги і списки, а також
так звані адаптери, тобто контейнери, які реалізовують стеки, черги і черги з пріоритетами.
• Асоціативні контейнери (associative containers) дозволяють за допомогою ключів (keys) отримати швидкий
доступ до значень, які зберігаються у контейнері. Наприклад, у класі map визначається асоціативний список, який
забезпечує доступ до значень за допомогою унікальних ключів. Тобто в асоціативних списках зберігаються пари
ключ/значення, що дозволяє при наявності ключа отримати відповідне значення.
• Існує п’ять типів асоціативних контейнерів: словники (набори пар), словники з дублюванням або пари з не
унікальними ключами, множини, не унікальні множини і бітові множини (масиви, набори).
• Синтаксично контейнер є класом-шаблоном. Ці шаблони забезпечують стандартизований інтерфейс для різних
контейнерів.
• Оскільки імена типів елементів, які входять в оголошення класу-шаблону можуть бути найрізноманітнішими, то у
контейнерах за допомогою зарезервованого слова typedef оголошуються деякі узгоджені версії цих типів. Це
дозволяє конкретизувати імена типів.
• У кожному контейнері визначений набір функцій для роботи з цим контейнером. Так, наприклад, список містить
функції для вставлення, знищення і об’єднання елементів. В контейнері стек є функції для розміщення елемента і
виштовхування його з контейнера.
#include <iostream>
#include <vector>
using namespace std;
vector<int> mas;
main(){
cout<<"Введіть розмір масиву ";
int sz;
cin>>sz;
int val;
for(int i=0;i<sz;i++)
{
cout<<"Введіть "<<i<<" елемент";
cin>>val;
// додавання елементів в масив
mas.push_back(val);
}
cout<<"Перший елемент: "<<mas[0];
}
НабірНабір контейнерівконтейнерів STLSTL
<vector>векторvector
<stack>стекstack
<set>множина унікальних елементівset
<queue>чергаqueue
<queue>черга з пріорітетомpriority_queue
<set>множина елементівmultiset
<map>асоціативний список для зберігання пар ключ/значення. З
одним ключем може бути зв'язано декілька значень
multimap
<map>асоціативний список для зберігання пар ключ/значення. З
одним ключем зв'язано лише одне значення
map
<list>лінійний списокlist
<deque>двостороння чергаdeque
<bitset>набір бітівbitset
ФЗОписКонтейнер
СписокСписок типівтипів STLSTL
Узгоджене ім'я типу Опис
size_type Інтегральний тип, еквівалентний типу size_t
reference Посилання на елемент
const_reference Постійне посилання
iterator Ітератор
const_iterator Постійний ітератор
reverse_iterator Зворотній ітератор
const_reverse_iterator Постійний зворотній ітератор
value_type Тип значення в контейнері
allocator_type Тип розподільника пам’яті (алокатора)
key_type Тип ключа
key_compare Тип порівняння двох ключів
value_compare Тип порівняння двох значень
ПослідовніПослідовні контейнериконтейнери
• Вектор (vector), черги, двонаправлена чергa (deque), стек (stack) і список (list) складають
набір послідовних контейнерів STL.
• Вони підтримують різні набори операцій (методів), серед яких є такі що збігаються.
Операція Метод vector deque list
Вставка напочаток push_front() - + +
Видалення з початку pop_front() - + +
Вставка в кінець push_back() + + +
Видалення з кінця push_front() + + +
Вставка в довільному місці insert() + + +
Видалення з довільного місця erase() + + +
Довільний доступ до елемента [] . At + + -
Кількість елементів size() + + +
Максимальний розмір контейнера max_size() + + +
Булівська функція, яка визначає чи
контейнер є порожнім
empty() + + +
КонтейнерКонтейнер векторвектор ((vectorvector))
• Контейнер веrтор (vector) - це структура, яка ефективно реалізовує прямий доступ до елементів, додавання і
знищення з кінця. В контейнері vector підтримуються динамічні масиви, тобто масиви, розміри яких можуть збільшуватись
за потребою.
• Виділення фіксованого розміру пам’яті для масиву є більш ефективним. Водночас, воно є і найбільшим обмеженням,
оскільки не дозволяє адаптувати масив до змін, які виникають під час виконання програми. Вирішенням цієї проблеми є
використання контейнера вектор, який виділяє пам’ять під масив по мірі потреби. Незважаючи на те, що вектор за своєю
природою є динамічним масивом, для доступу до його елементів можна використовувати звичайну операцію індексації.
• Для будь-якого об’єкта, який зберігається у векторі повинен бути визначений конструктор по замовчуванню. Окрім цього,
повинні бути визначені також оператори порівняння < і == (для вбудованих типів усі вказані вимоги задовільняються
автоматично).
• Специфікація шаблону-класу vector має вид:
• template<class T, class Allocator = allocator<T>>class vector;
Тут T - тип значень (шаблонний тип), які будуть зберігатись у контейнері vector. Зарезервоване слово Allocator визначає
розподільник пам’яті, який по замовчуванню є стандартним.
• В класі vector є такі конструктори:
1. explicit* vector (const Allocator& a = Allocator());
2. explicit vector (size_type n, const T& значення = T(), const Allocator &a = Allocator());
3. vector (const vector<T, Allocator>& об’єкт);
4. template<class InIter>vector (InIter початок, InIter кінець, const Allocator &a=Allocator())
• Перша форма є конструктором порожнього вектора.
• Друга форма створює вектор довжиною n елементів, кожен з яких елемент рівний значенню. Параметр значення
приймає аргумент по замовчуванні, який для вбудованих типів є нульовим значенням. Для користувацьких типів
значення аргумента по замовчуванні визначається конструктором без параметрів для даного типу.
• Третя форма є конструктором копіювання.
• Четверта форма - це конструктор вектора, який створює вектор шляхом копіювання вказаного за допомогою ітераторів
діапазону значень.
#include <vector>
using namespace std;
class A {
public:
int i;
A(){i=0;}
A(int i){A::i=i;}
};
vector<int> v1; //1-форма
vector<int> v2(5); //2-форма
vector<int> v3(5,4); //2-форма
vector<int> v4=v3; //3-форма
vector<int> v5(v3); //3-форма
vector<int> v6(v2.begin(),v2.begin()+2);//4-форма
vector<A> v7(3); //2-форма
vector<A> v8(3, A(4)); //2-форма
ОператориОператори контейнераконтейнера vectorvector
• Для класу vector визначені оператори:
 оператор присвоєння = :
 vector<T>& operator= (const vector<T>&);
 оператор (функція-шаблон) порівняння на рівність == (рівність забезпечується
рівністю усіх відповідних пар елементів):
 template <class T> bool operator== (const vector<T>&, const
vector <T>&);
 оператор (функція-шаблон) порівняння на меньше < (один вектор вважається
меншим від іншого, якщо перший з елементів одного вектора є меншим від
відповідного елемента другого):
 template <class T> bool operator< (const vector<T>&, const
vector <T>&);
 оператор індексації [] :
 reference operator[] (size_type);
 const_reference operator[] (size_type) const;
• Окрім наведених визначено також операції !=, <=.
МетодиМетоди доступудоступу додо елементівелементів
контейнераконтейнера векторавектора
• Методи доступу до елементів вектора (окрім оператора []) :
 доступ до елементів вектора з перевіркою виходу за границю вектора (оператор індексації такої
перевірки не здійснює). У випадку виходу за границю контейнера генерується КС out_range
 reference at(size_type n);
 const_reference at(size_type n) const;
 вибірка першого елемента (посилання на елемент) контейнера
 reference front();
 const_reference front() const;
 вибірка останнього елемента контейнера
 reference back();
 const_reference back() const;
МетодиМетоди управлінняуправління обсягомобсягом
контейнераконтейнера vectorvector
• визначення розміру контейнеру
 size_type size() const;
• визначення максимально допустимого розміру контейнеру
 size_type max_size() const;
• зміна розміру контейнеру. Перший параметр задає новий розмір, другий параметр - значення,
які, у випадку збільшення розміру, будуть присвоюватись новим елементам контейнера. Нові
елементи будуть додаватись в кінець
• void resize (size_type,T c = T());
• визначення розміру пам’яті, яку займає контейнер
 size_type capacity() const;
• перевірка чи контейнер порожній
 bool empty() const;
• задання розміру пам’яті для контейнера
 void reserve(size_type);
МетодиМетоди змінизміни обоб’’єктівєктів контейнераконтейнера vectorvector
• додавання нового елемента в контейнер (в кінець)
 void push_back(const T&);
• знищення останнього елемента в контейнері
 void pop_back();
• додавання елемента, який задається другим параметром в контейнер в позицію, яка вказана першим параметром
 iterator insert (iterator, const T& = T());
 додавання n однакових елементів в позицію, яка вказана першим параметром
 void insert(iterator, size_type n, const T& = T());
 додавання елементів з діапазону, який задається другим та третім параметрами, в позицію, яка вказана першим
параметром
 template <class InputIterator> void insert(iterator, InputIterator, InputIterator);
• знищення елемента, який адресується параметром
 void erase(iterator);
• знищення елементів з діапазону, який задаєтьяс параметрами
 void erase(iterator, iterator);
• обмін елементами двома контейнерами
 void swap(vector<T>&);
• копіювання елементів, яке є аналогічне діє конструкторів другої та третьої форми
 template <class InputIterator> void assign(InputIterator first, InputIterator last);
 template <class Size, class T> void assign(Size n, const T& t = T());
ПрикладПриклад контейнераконтейнера vectorvector
#include <vector>
#include <iostream>
using namespace std;
// створити вектор нульової довжини
vector<int> v;
int main()
{
int i;
for(i=0; i<10; i++)
// додати елементи у вектор
v.push_back(i);
cout<<"Розмір: "<<v. size() <<endl;
for(i=0; i<v.size(); i++)
// вивід елементів вектора
cout<<i<<"-ий елемент"<<v[i]<<endl;
//ітератор на початок
vector<int>::iterator p=v.begin();
// ітератор на третій елемент
p+=2;
// вставити 10 елементів рівних 0
v.insert(p, 10, 0);
p=v.begin(); p+=4;
// знищити починаючи з 5-го 2 елемента
v.erase(p, p+2);
v.begin();
while(p!=v.end())
{
// вивід вмісту вектора через ітератор
cout<<*p<<" ";
p++;
};
return 0;
АсоціативніАсоціативні контейнериконтейнери
• Як вже відзначалось, асоціативні контейнери забезпечують швидкий доступ до даних за рахунок того, що
вони побудовані на основі збалансованих дерев пошуку (стандартом регламентується тільки інтерфейс
контейнера, а не їх реалізація).
• Асоціативні контейнери залежать від двох параметрів - Key (ключ) і Compare (відношення повного
впорядкування за ключем Key) . Контейнери set і multiset є “виродженими” асоціативними контейнерами, у
яких значення не є особливо важливими - усі операції здійснюються за допомогою ключів. Контейнер
шаблону set повинен складатись із унікальних ключів, а multiset - допускає дублювання ключів.
• Контейнери типу map і multimap елементами є пари значень, які складаються з об’єктів шаблонного типу T,
які, у свою чергу, зв’язані з об’єктами типу Key.
• Для зберігання пари “ключ-елемент” використовується шаблон pair, який описаний у ФЗ <utility>.
template <class T1, class T2> struct pair
{
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair (const T1& x, const T2& y);
template <class U, class V> pair(const pair<U,V>& p);
};
• Ітератори асоціативних контейнерів є двонапавленими. Оператори вставляння не впливають на коректність
ітераторів і посилання на елементи контейнера, а операція видалення анулює лише ітератори та посилання
на видалені елементи Окрім того, ітератори асоціативних контейнерів пересуваються по елементах
контейнера лише в порядку зростання ключів.
• Існуть такі асоціативні контейнери:
 унікальні словники (map),
 словники (multimap),
 унікальні множини (set),
 множини (multiset),
 бітові множини (bitset).
Операції, які є спільними для усіх
асоціативних контейнерів
Конструктори
AssociativeContainer () Створює порожній контейнер
AssociativeContainer (const Comparison& с) Створює порожній контейнер із заданим відношенням порівняння
AssociativeContainer (i, j) Створює контейнер ініціалізований діапазоном [i,j]
AssociativeContainer (i, j, с) Створює контейнер ініціалізований діапазоном [i,j] із заданим відношенням
порівняння
Доступ до елементів контейнера
iterator find(key) Здійснює пошук елемента за задним ключем, повертає ітератор на шуканий
елемент
const-iterator find(key)
iterator lower_bound(key) Повертає ітератор на перший знайдений за заданим ключем елемент
const iterator lower_bound(key)
iterator upper_bound(key) Повертає ітератор на наступний від знайденого за заданим ключем елемент,
ключ якого є більшим від ключа знайденого елемента
const iterator upper_bound(key)
pair<iterator, iterator> equal_range(key) Повертає пару ітераторів на перший та останній елементи, ключі яких рівні
заданому
size_t count(key) Повертає кількість елементів, які мають заданий ключ
Вставляння і видалення
pair<iterator,bool> insert(t) Вставляє елемент t. Повертає пару, яка складється з ітератора, який
посилається на елемент, що вставлявся, та логічне значення (true — вставляння
виконане, false — вставляння не виконане)
void insert(i,j) Вставляє в контейнер діапазон [i,j]
void erase(pos) Видаляє елемент, на який посилається ітератор pos
size_t erase(key) Видаляє елемент, який має ключ key
void erase(i,j) Видаляє діапазон [i,j]
Контейнер map
• Контейнер map - унікальний словник, або набір унікальних пар або асоціативний
список.
• Словник будується на основі пар значень. Перше значення є ключем для індентифікації
пари, а друге - саме значенням.
• Ключем може бути значення будь-якого типу. Але в контейнері map він є унікальним.
• Типовий заголовок шаблону map може бути таким
 template <class Key, class T, class Compare = less<Key> class Allocator
= allocator<pair<const Key, T>> > class map;
• Конструктори деструктор :
1. explicit map(const Compares comp = Compare(), const Allocator&=
Allocator());
2. template <class Inputlterator> map(Inputlterator first, Inputlterator
last, const Compares: comp = Compared, const Allocators = Allocator());
3. map (const map<Key, T, Compare, Allocator>&);
4. ~map();
• Перша форма конструктора створює порожній словник.
• Друга форма створює асоціативний список через задавання початку і кінця діапазона, а
також функцію присвоєння
 map<Key,T,Compare,Allocator>& operator=(const
map<Key,Т,Compare,Allocator>& x);
• Цей конструктор створює асоціативний список та ініціалізує його елементами x.
• Третя форма є конструктором копії.
• І, нарешті, шаблон map має деструктор, який знищує словник у пам’яті.
Операції над контейнером map
• зміна і визначення розміру об’єкта:
 визначення кількості елементів у словнику
– size_type size() const;
 визначення максимально кількості елементів у словнику
– size_type max_size() const;
 перевірка чи масив є порожнім. Якщо так, то повертається true. В противному випадку - false.
– bool empty() const;
• оператор доступу:
 доступ до елементів асоціативного списку забезпечується операторм індексації
– operator[](const key_type& x);
• операції вставляння:
• Вставляння елементів у словник здійснюється такими методами:
 вставляння елементу у контейнер і повернення пари, яка складається з ітератора і булівського значення.
Оскільки об’єкт шаблону map не допускає дублювання, то пара, яка повертається дозволяє визначити
успішність виконання операції, яка здійснюється. Якщо у словнику не існувало елемента із заданим
ключем, то булівська змінна (у парі, яка повертається) буде містити значення true, а ітератор буде
посилатись на вставлений елемент. Решту варіантів функції insert() не дозволяють з’ясувати чи виконане
вставляння
– pair<iterator, bool> insert(const value_type& x) ;
 вставляння елемента перед елементом, на який посилається ітератор position
– iterator insert(iterator position, const value_type& x);
 вставляння діапазона елементів, який визначається ітераторами first та last
– template <class Inputlterator> void insert(InputIterator first, Inputlterator last);
• операції знищення:
 знищення елемента, на який посилається ітератор position
– void erase(iterator position);
 знищення елемента по заданому ключу
– size_type erase (const key_type& x) ;
 заміна місцями елементів словника, який викликає метод, і аргумента
– void swap(map<Key, Т, Compare, Allocators);
 очищення словника (видалення усіх елементів)
– void clear();
Операції над контейнером map
• функтори порівняння:
 повертання функтора, який порівнює ключі
– key_compare key_comp() const;
 повертання функтора, який порівнює значення
– value_compare value_comp()const;
• операції пошуку:
 метод find()повретає ітератор, який встановлений на шукане значення. Якщо шуканого значення не
знайдено, то повертатиметься ітератор, який встановлений на значення поза межами контейнера. Пошук
здійснюється за ключем
– iterator find(const key_type& x);
– const_iterator find(const key_type& x) const;
 повертання кількості елементів, які мають заданий ключ
– size_type count(const key_type& x) const;
 повертання ітератора, який посилається на початок послідовності елементів, що мають заданий ключ
– iterator lower_bound(const key_type& x);
– iterator lower_bound(const key_type& x) const;
 повертання ітератора, який посилається на кінець послідовності елементів, що мають заданий ключ
– iterator upper_bound(const key_type& x);
– iterator upper_bound(const key_type& x) const;
 повертання пари, яка складається із ітераторів, які посилається на початок та кінець послідовності
елементів, що мають заданий ключ
– pair<iterator,iterator> equal_range(const key_type& x);
– pair<iterator,iterator> equal_range(const key_type& x) const;
Операції порівняння контейнера map
• оператор перевірки рівності двох словників. У випадку, якщо словники x і y складаються з однакових
елементів, то повертає значення true. Операція порівняння задається функтором Compare
– template <class Key, class T, class Compare, class Allocator> bool operator< (const map<Key,T, Compare,
Allocators x, const map<Key,T, Compare, Allocators y);
• оператор перевірки нерівності “менше” двох словників. У випадку, якщо словник x є меншим від словника y
, то повертає значення true. Операція порівняння задається функтором Compare
– template <class Key, class Т, class Compare, class Allocator> bool operator!= (const map<Key, T,
Compare, Allocators x, const map<Key,T, Compare, Allocators y) ;
• оператор перевірки рівності двох словників. У випадку, якщо словники x і y складаються з неоднакових
елементів, то повертає значення true. Операція порівняння задається функтором Compare
– template <class Key, class T, class Compare, class Allocator> bool operator ! = (const map<Key,T,
Compare, Allocators x, const map<Key,T, Compare, Allocators y) ;
• оператор перевірки нерівності “більше” двох словників. У випадку, якщо словник x є більшим від словника
y , то повертає значення true. Операція порівняння задається функтором Compare
– template <class Key, class Т, class Compare, class Allocator> bool operator> (const map<Key,T,Compare,
Allocators x, const map<Key,T,Compare, Allocators y);
• оператор перевірки нерівності “більше рівне” двох словників. У випадку, якщо словник x є більшим або
рівним словнику y , то повертає значення true. Операція порівняння задається функтором Compare
– template <class Key, class T, class Compare, class Allocator> bool operator>=(const map<Key,T,Compare,
Allocators x, const map<Key, T, Compare, Allocators y);
• оператор перевірки нерівності “менше рівне” двох словників. У випадку, якщо словник x є меншим або
рівним словнику y , то повертає значення true. Операція порівняння задається функтором Compare
– template <class Key, class T, class Compare, class Allocator> bool operator<=(const map<Key,T,Compare,
Allocators x, const map<Key,T,Compare, Allocators y);
• зміна місцями елементів словників x та y.
– template <class Key, class T, class Compare, class Allocator> void swap (map<Key, T, Compare, Allocators
x, map<Key, T, Compare, Allocators y);
Приклад контейнера map
#include <iostream>
#include <map>
#include <string>
using namespace std;
typedef map<int, char*, less<int> > MAP;
void print(MAP &Map);
void reverse_print(MAP &Map);
int main()
{
const int SIZE = 5;
char* NUMBERS[]={"One", "Two", "Three", "Four",
"Five"};
int i;
MAP::iterator where, newWhere;
// Порожні словники
MAP Map, newMap;
// Заповнення словника через функцію insert()
for (i = 0; i < SIZE; i++)
{
Map.insert(MAP::value_type(i,NUMBERS[i]));
newMap.insert(MAP::value_type(i,NUMBERS[i]));
}
printf("Словник Mapn");
print(Map);
printf("Словник newMapn");
print(newMap);
// Вивід вмісту словника у зворотньому порядку
printf("Словник Map у зворотньому порядкуn");
reverse_print(Map);
printf("Словник newMap у зворотньому порядкуn");
reverse_print(newMap);
// Вивід на екран розмірів словників
int MapSize = Map.size();
printf("Розмір словника Map = %dn", MapSize);
MapSize = newMap.size();
printf("Розмір словника newMap = %dn", MapSize);
// Вивід на екран максимальних розмірів словників
MapSize = Map.max_size();
printf("Максимальний розмір масиву Map = %dn",
MapSize);
MapSize = newMap.max_size();
printf("Макс. розмір масиву newMap = %dn",
MapSize);
// Вивід на екрант кількості п'ятірок
MapSize = Map.count(5);
printf("Кількість п'ятірок у наборі Map = %dn",
MapSize);
MapSize = newMap.count(4);
printf("Кількість 5 у наборі newMap = %dn",
MapSize);
// Шукаємо і видаляємо трійку в Map
where = Map.find(3);
Map.erase(where) ;
printf("Словник Map після видалення трійкиn");
print(Map);
// Видалення двох останніх елементів Map
where = Map.find(2);
Map.erase (where, Map.end() );
printf("Словник Map після видалення двох останніх
елементівn");
print(Map);
// Очищаємо Map за допомого функції clear()
Map.clear();
printf("Спроба вивести порожній словник n");
print(Map);
// Заповнюємо Map за допомогою методу insert
// Дублювання не допускається
for (i =0; i < 10; i++)
{
if(i<2) Map.insert(MAP::value_type(2,"Two"));
if(i<2 && i< 5)
Map.insert(MAP::value_type(7,"Seven"));
if(i>5) Map.insert(MAP::value_type(10,"Ten"));
}
printf("Новий словник Марn"); print(Map);
// Перестановка словників
swap(Map, newMap);
printf("Словник Map після обмінуn");
print(Map);
printf ("Словник newMap після обмінуn");
print(newMap);
// Діапазон, який складається з десяток
printf("Діапазон, який складається з десятокn");
for (where=newMap.lower_bound(10) ; where !=
newMap.end(); where++)
printf("(%d, %s) ", (*where).first,
(*where).second);
printf("n");
// Діапазон, який складається з двійок
printf("Діапазон, який складається з двійокn");
for (where=newMap.begin(); where!=
newMap.upper_bound(2); where++)
printf("(%d, %s)
",(*where).first,(*where).second);
printf("n");
// Діапазон, який складається з cемірок
printf("Діапазон, який складається з cемірокn");
for (where=newMap.equal_range(7).first;
where!= newMap.equal_range(7).second; where++)
printf("(%d, %s)
",(*where).first,(*where).second);
printf("n");
// Звертання до елементів словника
// через метод operator[] ()
printf ("operator [ ] n");
for(where=newMap.begin(); where!=newMap.end();
where++)
printf("(%d, %s) ",*where,
newMap[(*where).first]);
printf ("n");
// Порівняння словників
if (Map == newMap) printf("Map == newMapn");
if(Map > newMap) printf("Map > newMapn");
if(Map >= newMap) printf("Map >= newMapn");
if(Map < newMap) printf("Map < newMapn");
if(Map <= newMap) printf("Map <= newMapn");
return 0;
}
void print(MAP &Map)
{
if (Map.empty())
{
printf("%s n","Словник є порожнім");
return;
}
MAP::iterator i;
for(i = Map.begin(); i != Map.end(); i++)
printf("(%d, %s) ",(*i).first,(*i).second);
printf ("n");
}
void reverse_print(MAP &Map)
{
if (Map.empty())
{
printf ("%s n", "Словник є порожнім");
return;
}
MAP::reverse_iterator i;
for(i = Map.rbegin(); i!=Map.rend(); i++)
printf ("(%d, %s) ", (*i) .first, (*i) .second) ;
printf("n") ;
}
Алгоритми
• Алгоритми (algorithms) виконують операції над вмістом контейнера (тобто над об’єктами контейнера).
• Існують найрізноманітніші алгоритми - від ініціалізації до заміни вмісту контейнера. Окрім цього, вони
дозволяють одночасно працювати з двома контенерами різних типів. Багато алгоритмів призначені для
роботи з послідовністю, яка є лінійним списком елементів всередині контейнера.
• Хоча кожен контейнер і підтримує власний набір операцій, проте існує набір стандартних алгоритмів, які
забезпечують більш широкі і комплексні дії. Використання стандартних алгоритмів пов’язане з
необхідністю підикання ФЗ <algorithm.h>.
• Усі алгоритми з <algorithm. h> є функціями-шаблонами. Це дає можливість використовувати їх з
контейнерами будь-яких типів. Наведемо приклад використання алгоритму, наприклад count. Його
реалізація в середовищі Borland C++ відрізняєтьтся від реалізації у специфікації Standart C++. А тому
приведемо прклади для обох версій мови.
• Прототип алгоритму count у версії Standart C++ має вигляд
 template <class InIter, class T> size_t count(InIter початок, InIter кінець, const
T& значення);
• Третій параметер значення є параметром на рівність якому порівнються усі елементи контейнера, а їх
кількість повертається алгоритмом.
#include <iostream>
#include <vector>
using namespace std;
vector<int> mas;
main(){
cout<<"Введіть розмір масиву ";
int sz;
cin>>sz;
int val;
for(int i=0;i<sz;i++){
cout<<"Введіть "<<i<<" елемент";
cin>>val;
mas.push_back(val); // додавання елементів в масив
}
int n = count(mas.begin(),mas.end(),1);
cout<<"Кількість елементів рівних 1 є "<<n;
}
КатегоріїКатегорії алгоритмівалгоритмів
for_each sort сору
find stable_sort copy_backward
find_end partial_sort swap_ranges
find_if partial_sort_copy swap
find_first_of nth_element iter_swap
adjacent_find lower_bound transform
count upper_bound replace
count_if equal_range replace_if
mismatch binary_search replace_copy
equal merge replace_copy_if
search inplace_merge fill
search_n includes fill_n
set_union generate
set_intersection generate_n
accumulate set_difference remove
inner_product set_symmetric_difference remove_if
partial_sum make_heap remove_copy
adjacent_difference push_heap remove_copy_if
pop_heap unique
sort_heap unique_copy
min reverse
max reverse_copy
min_element rotate
max_element rotate_copy
lexicographical_compare random_shuffle
next_permutation partition
prev_permutation
Алгоритми сортування та пошуку
Алгоритми, які не змінюють
вміст контейнерів Модифікуючі алгоритми
Чисельні алгоритми
Часова складність
ІтераториІтератори• Ітератори (iterators) - об’єкти, які по відношенню до контейнерів відіграють роль
вказівників. Вони дозволяють отримати доступ до елементів контейнерів,
аналогічно як вказівники використовуються для доступу до елементів масиву.
• Доступ до поточного елемента контейнера, подібно до вказівників,
здійснюється за операцій * і ->. Перехід до наступного елемента - за
допомогою операції інкремента. Для усіх ітераторів визначені також операції
присвоєння, перевірка на рівність і нерівність.
• Типом ітераторів оголошується тип iterator, який є визначеним у ФЗ
<iterator>. Окрім цього типу у ФЗ <iterator> описуються також ітераторні класи і
функції. При використанні стандартних контейнерів цей ФЗ підмикається
автоматично.
• Існує п’ять основних типів ітераторів (їх список наведений в таблиці).
Ітератор RandIter не підтримується контейнером list. Решта контейнерів
підтримують ітератори усіх типів.
• Бібліотека STL підтримує також так звані зворотні ітератори (reverse
iterators). Цими ітераторами можуть бути або bidirectional або random access
ітератори, які проходить послідовність елементів як у прямому так і у
зворотньому напрямках. Якщо зворотній ітератор вказує на останній елемент
послідовності, то його інкремент (++) приведе до вказування на передостанній.
#include <iostream>
#include <vector>
using namespace std;
vector<int> mas;
main(){
cout<<"Введіть розмір масиву ";
int sz;
cin>>sz;
int val;
for(int i=0;i<sz;i++){
cout<<"Введіть "<<i<<" елемент";
cin>>val;
mas.push_back(val); // додавання елементів в
масив
}
vector<int>::iterator p=mas.begin();
for(;p<mas.end();p++) cout<<" Елемент="<<*p;
}
Ітератор Опис Термін
Довільного доступу
(random access)
Використовується для
зчитування та запису значень.
Доступ до елементів довільний.
RandIter
Двонаправлений
(bidirectional)
Використовується для
зчитування та запису значень.
Може проходити контейнер в
обох напрямках.
BiIter
Однонаправлений
(forward)
Використовується аналогічно.
Може проходити контейнер
лише в одному напрямку.
ForIter
Вводу
(input)
Використовується для
зчитування значень. Може
проходити контейнер лише в
одному напрямку.
InIter
Виводу
(output)
Використовується для запису
значень. Може проходити
контейнер лише в одному
напрямку.
OutIter
 Ітератори можуть бути постійними. Такі ітератори використовуються тоді, коли треба заборонити зміну елемнтів в контейнері.
 Якщо ітератор вказує на конкретний елемент контейнера, то він вважається дійсним (ініціалізованим). В противному випадку - недійсним
(неініціалізованим). Ітератор може бути недійсним в таких випадках:
 ітератор не був ініціалізований;
 контейнер, з яким був зв’язаний ітератор, змінив розміри, або був знищений;
 ітератор вказує на кінець послідовності.
Кінець послідовності елементів контейнера є вказівником на елемент, який слідує за останнім елементом послідовності. Цей вказівник існує завжди.
Такий підхід дозволяє не розглядати порожню послідовність елементів як особливий випадок. Поняття “нульовий” ітератор не існує.
Ітератори утворють певну ієрархію в порядку
їх оголошення в таблиці. Очевидно, що
ітератор з більшими можливостями (який
стоїть вище в ієрархії) може
використовуватись замість ітератора з
меншими. Наприклад однонаправлений
ітератор може замінити ітератор вводу (тут
мається на увазі ввід/вивід значень у
контейнери).
АМО.L9
(L9.2)
БібліотекиБібліотеки BoostBoost
Boost
• Boost — набір бібліотек, які розширюють функціональність C++.
• Вільно поширюються за ліцензією Boost Software License разом
з сирцевим кодом.
• Бібліотеки boost є кандидатами на включення в наступний
стандарт C++.
• Деякі бібліотеки boost були включені стандарт C++ ще в 2011
році.
• При включенні бібліотеки в boost вона проходить кілька етапів
рецензування.
• Має власну систему “збирання” (Boost Build).
• У сучасній версії (1.66) в boost більше сотні бібліотек.
• Сирцевий код і документація доступні на https://www.boost.org .
Категорії бібліотеки Boost
• String and text processing
• Containers
• Iterators
• Algorithms
• Function objects and
higher-order programming
• Generic Programming
• Template
Metaprogramming
• Concurrent Programming
• Math and numerics
• Correctness and testing
• Data structures
• Domain Specific
• System
• Input/Output
• Memory
• Image processing
• Inter-language support
• Language Features Emulation
• Parsing
• Patterns and Idioms
• Programming Interfaces
• State Machines
• Broken compiler workarounds
• Preprocessor Metaprogramming
any
Assignment Library(assign)
function
bind
bind and function
lexical_cast
optional
static_assert
String Algorithms
variant
filesystem
ASIO
ASIO
АМО.L10
(L10.0)
Іспит: (42 + 42) / 2 + (28 V 28) * kзахист
Д.З. №1
• Вивести на екран в конструкторі класу ClassA власне
прізвище. Пояснити різницю в роботі коду, що був
скомпільований різними версіями компілятора.
sh-4.4$ g++ -std=c++17 -o main *.cpp
sh-4.4$ main
+
+
sh-4.4$ g++ -std=c++14 -o main *.cpp
sh-4.4$ main
+
+
sh-4.4$ g++ -std=c++11 -o main *.cpp
sh-4.4$ main
+
+
sh-4.4$ g++ -std=c++0x -o main *.cpp
sh-4.4$ main
+
+
sh-4.4$ g++ -std=c++03 -o main *.cpp
sh-4.4$ main
+
sh-4.4$ g++ -std=c++98 -o main *.cpp
sh-4.4$ main
+
sh-4.4$
#include <iostream>
#include <vector>
using namespace std;
class ClassA{
public:
ClassA(){
cout << "+" << endl;
}
};
int main()
{
vector<ClassA> vectorOfObjectsA;
vectorOfObjectsA.resize(2);
return 0;
}
Д.З. №2
• Знайти кількість входжень другої літери
прізвища в П.І.Б.
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string str = "00110011123456789";
cout << std::count(str.begin(), str.end(), '1') << endl;
return 0;
}
АМО.L10
(L10.1)
from Java API
Java's Collections
Framework
(JCL)
Java(Platform)
Java(Platform)
Java Collections Framework
• Java Collections Framework - набір зв'язаних класів та
інтерфейсів, які реалізують commonly reusable
collection структури даних. Він був вперше
спроектований і розроблений Джошуа Блохом.
• JCF був розроблений для досягнення ряду цілей:
• Фреймворк повинен бути високопродуктивний.
Реалізації фундаментальних колекцій (динамічні
масиви, зв'язані списки, дерева та хеш-таблиці)
повинні бути високоефективними.
• Система повинна дозволяти різним типам колекцій
працювати аналогічним чином і з високим ступенем
взаємодії.
• Фреймворк має легко поширювати та/або адаптувати
колекцію.
Засоби узагальненого
програмування в java
• Колекція – це об'єкт, який представляє групу об'єктів.
Використання колекцій забезпечує підвищення ефективності
програм завдяки використанню високоефективних алгоритмів, а
також сприяє створенню коду, придатного для повторного
використання. Основними елементами засобів роботи з
колекціями є такі:
– інтерфейси
– стандартні реалізації інтерфейсів
– алгоритми
– утиліти для роботи з масивами
• Засоби Java для роботи з колекціями надають уніфіковану
архітектуру для представлення та управління наборами даних.
Ця архітектура дозволяє працювати з колекціями незалежно від
деталей їх внутрішньої організації. Засоби для роботи з
колекціями включають більше десятка інтерфейсів, а також
стандартні реалізації цих інтерфейсів і набір алгоритмів для
роботи з ними.
Архітектура JCL
• Майже всі колекції породжуються інтерфейсом
java.util.Collection, який визначає основну структуру всіх
колекцій. Його методи: add() - додавання елементу до колекції,
remove() - видалення елементу з колекції, toArray() - повертає
масив елементів, які є в колекції, contains() - перевіряє
наявність заданого елементу в колекції та інші. Інтерфейс
Collection успадковується від інтерфейсу java.lang.Iterable
Інтерфейс Collection
Видаляє всі елементи з колекціїvoid clear()
Залишає об'єкти, наявні в другій колекціїboolean retainAll(Collection<?> c)
Видаляє об'єкти з колекціїboolean removeAll(Collection<?> c)
Додає об'єкти в колекцію. Повертає true, якщо об'єкти додані
boolean addAll(Collection<? extends E>
c)
Повертає true якщо колекція містить іншу колекціюboolean containsAll(Collection<?> c)
Видаляє об'єкт з колекціїboolean remove(Object o)
Додає об'єкт у колекцію. Повертає true, якщо об'єкт доданийboolean add(E e)
Повертає масив посилань на T, який містить копії всіх елементів колекції<T> T[] toArray(T[] a)
Повертає масив посилань на Object, який містить копії всіх елементів колекціїObject[] toArray()
Повертає ітератор – об'єкт, який послідовно вказує на елементиIterator<E> iterator
Повертає true, якщо колекція містить об'єктboolean contains(Object o)
Повертає true, якщо колекція порожняboolean isEmpty()
Повертає розмір колекціїint size()
ОписМетод
Map
• Асоціативні масиви можуть зберігати пари посилань на об'єкти.
Асоціативні масиви теж є узагальненими типами. Асоціативні
масиви у Java представлені узагальненим інтерфейсом Map,
який реалізовано, зокрема, класом HashMap. Інтерфейс
SortedMap, похідний від Map, вимагає впорядкованого за
ключем зберігання пар. Інтерфейс NavigableMap, що з'явився в
java SE 6, розширює SortedМap і додає нові можливості пошуку
за ключем. Цей інтерфейс реалізовано класом TreeMap.
• На логічному рівні можна представити асоціативний масив
через три допоміжних колекції:
– keySet - множина значень ключа;
– values - список значень;
– entrySet - множина пар «ключ-значення».
Ітератор
• Для проходження по колекції (списку) об'єктів
використовується ітератор – спеціальний допоміжний
об'єкт. Як і самі контейнери, ітератори базуються на
інтерфейсі. Інтерфейс Іterator, визначений у
пакеті java.utіl. Будь-який ітератор має три методи:
– boolean hasNext(); // перевіряє, чи є ще елементи в
контейнері, та повертає true, якщо ще є елементи
послідовності.
– Object next(); // повертає посилання на наступний елемент
– void remove(); // видаляє останній обраний елемент (на
який посилається ітератор)
Робота зі списками
• Інтерфейс List описує упорядковану колекцію (послідовність). Цей інтерфейс
реалізують стандартні класи ArrayList і LinkedList. Клас ArrayList реалізує список
за допомогою масиву змінної довжини. Клас LinkedList зберігає об'єкти за
допомогою так званого зв'язаного списку.
• У списках зберігаються посилання на java.lang.Object. Як і в масивах, доступ до
елементів може здійснюватися за індексом (але не через операцію []). На
відміну від масивів, розмір списків може динамічно змінюватися. Java надає
варіанти створення списків як із застосуванням узагальнень, так і без них.
Варіант без узагальнень вважається застарілим і небажаним.
List<String> s = new ArrayList<String>();
s.add("First");
s.add("Second");
for (Iterator<String> i = s.iterator(); i.hasNext(); ) {
System.out.println(i.next());
}
//for (int i = 0; i < s.size(); i++) {
// System.out.println(al.get(i));
//}
Робота з множинами
• Множина – це колекція, що не містить однакових елементів. Три основних реалізації
інтерфейсу Set - HashSet, LinkedHashSet і TreeSet. Як і списки, множини є узагальненими
типами. Класи HashSet і LinkedHashSet використовують хеш-коди для ідентифікації
елемента. Клас TreeSet використовує двійкове дерево для збереження елементів і гарантує
їх певний порядок.
• У наведеному нижче прикладі до множини цілих чисел додається десять випадкових
значень у діапазоні від -9 до 9:
import java.util.*;
public class SetOfIntegers {
public static void main(String[] args) {
Set<Integer> set = new TreeSet<Integer>();
Random random = new Random();
for (int i = 0; i < 10; i++) {
Integer k = random.nextInt() % 10;
set.add(k);
}
System.out.println(set);
}
}
Робота з чергою та стеком
• Для реалізації черги найзручніше використовувати клас LinkedList, який
реалізує інтерфейс Queue. Наприклад:
import java.util.LinkedList;
import java.util.Queue;
public class SimpleQueueTest {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
queue.add("First");
queue.add("Second");
queue.add("Third");
queue.add("Fourth");
String s;
while ((s = queue.poll()) != null) {
System.out.print(s + " "); // First Second Third Fourth
}
}
}
Робота з чергою та стеком
• У JRE 1.1 стек представлений класом Stack. Наприклад:
import java.util.Stack;
public class StackTest {
public static void main(String[] args) {
Stack<String> stack = new Stack<>();
stack.push("First");
stack.push("Second");
stack.push("Third");
stack.push("Fourth");
String s;
while (!stack.isEmpty()) {
s = stack.pop();
System.out.print(s + " "); // Fourth Third Second First
}
}
}
Робота з чергою та стеком
• Цей клас в даний час не рекомендований до використання. Замість нього можна
використовувати інтерфейс Deque, який оголошує аналогічні методи. Наприклад:
import java.util.ArrayDeque;
import java.util.Deque;
public class AnotherStackTest {
public static void main(String[] args) {
Deque<String> stack = new ArrayDeque<>();
stack.push("First");
stack.push("Second");
stack.push("Third");
stack.push("Fourth");
String s;
while (!stack.isEmpty()) {
s = stack.pop();
System.out.print(s + " "); // Fourth Third Second First
}
}
}
Алгоритми
• Для колекцій існує допоміжний клас Collections. Цей клас надає низку
функцій для роботи з колекціями.
• Клас Collections містить реалізацію статичних функцій:
• sort() (сортування),
• fill() (запис всіх значень),
• max() (пошук максимального елемента),
• min() (пошук мінімального елемента),
• indexOfSubList()(пошук індексу першого повного входження підсписку
у список),
• frequency() (визначення кількості разів входження певного елемента у
список),
• reverse() (заміна порядку елементів на протилежний),
• rotate() (циклічний зсув списку на задану кількість елементів),
• shuffle() ("тасування" елементів),
• nCopies() (створення нового списку з визначеною кількістю однакових
елементів).
Складнсть алгоритмів
java.util.concurrent
• В мові Java потік представляється в вигляді обєкту-потомка класу Thread. Цей клас інкапсулює стандартні
механізми роботи з потоком. Потоками можна управляти або напряму, або засобами абстрактних
механізмів, таких як Executor і колекції з пакету java.util.concurrent.
• Запустити новий потік можна двома способами:
– Реалізацією інтерфейсу Runnable
public class HelloRunnable implements Runnable {
public void run() {
System.out.println("Привіт з потоку!");
}
public static void main(String[] args) {
(new Thread(new HelloRunnable())).start();
}
}
– Наслідуванням від класу Thread
public class HelloThread extends Thread {
public void run() {
System.out.println("Привіт з потоку!");
}
public static void main(String[] args) {
(new HelloThread()).start();
}
}
from Framework Class Library
(FCL)
• using System.Collections.Generic
• using System.Collections // застаріла
• using System.Collections.Concurrent
АМО.L10
(L10.2)
.NET
Колекції
• Головна перевага колекцій полягає в тому, що вони стандартизують обробку груп об'єктів у
програмі. Всі колекції розроблені на основі набору чітко визначених інтерфейсів. Деякі
вбудовані реалізації таких інтерфейсів, в тому числі ArrayList, Hashtable, Stack та Queue,
можуть застосовуватися в початковому вигляді і без будь-яких змін. Є також можливість
реалізувати власну колекцію, хоча потреба в цьому виникає вкрай рідко.
• У середовищі .NET Framework підтримуються
п'ять типів колекцій:
• неузагальнені,
• спеціальні,
• для порозрядних операцій,
• узагальнені,
• паралельні.
Неузагальнені колекції
• Реалізують ряд основних структур даних, включаючи
динамічний масив, стек, чергу, а також словники, в
яких можна зберігати пари "ключ-значення". Відносно
неузагальнених колекцій важливо мати на увазі
наступне: вони оперують даними типу object. Таким
чином, неузагальнені колекції можуть служити для
зберігання даних будь-якого типу, причому в одній
колекції допускається наявність різнотипних
даних. Очевидно, що такі колекції не типізовані,
оскільки в них зберігаються посилання на дані типу
object. Класи та інтерфейси неузагальнених колекцій
знаходяться в просторі імен System.Collections
Спеціальні колекції
• Оперують даними спецефічного типу
або ж роблять це якимось особливим
чином. Наприклад, є спеціальні колекції
для символьних рядків, а також
спеціальні колекції, в яких
використовується односпрямований
список. Спеціальні колекції
оголошуються в просторі
імен System.Collections.Specialized
Поразрядна колекція
• У прикладному інтерфейсі Collections API
визначена одна колекція з порозрядною
організацією – це BitArray. Колекція типу
BitArray підтримує порозрядні операції,
тобто операції над окремими двійковими
розрядами, наприклад І, АБО, виключне АБО,
а отже, вона істотно відрізняється своїми
можливостями від інших типів
колекцій. Колекція типу BitArray
оголошується в просторі імен
System.Collections
Узагальнені колекції
• Забезпечують узагальнену реалізацію
декількох стандартних структур даних,
включаючи зв'язані списки, стеки, черги і
словники. Такі колекції є типізованими в силу
їх узагальненого характеру. Це означає, що в
узагальненій колекції можуть зберігатися
тільки такі елементи даних, які сумісні за
типом з даною колекцією. Завдяки цьому
виключається випадкова розбіжність
типів. Узагальнені колекції оголошуються в
просторі імен System.Collections.Generic
Паралельні колекції
• Підтримують багатопоточний доступ до
колекції.
• Ці узагальнені колекції, визначені в
просторі імен
System.Collections.Concurrent
Нумератор(перелічувач)
• Дуже важливим для всіх колекцій є поняття перелічувача, який
підтримується в неузагальнених інтерфейсах IEnumerator і
IEnumerable, а також в узагальнених інтерфейсах IEnumerator<T> і
IEnumerable<T>. Нумератор забезпечує стандартний спосіб
почергового доступу до елементів колекції. Отже, він перераховує вміст
колекції. У кожній колекції повинна бути реалізована узагальнена або
неузагальнених форма інтерфейсу IEnumerable, тому елементи будь-
якого класу колекції повинні бути доступні за допомогою методів,
визначених в інтерфейсі IEnumerator або IEnumerator<T>. Це означає,
що, внісши мінімальні зміни в код циклічного звернення до колекції
одного типу, його можна використовувати для аналогічного звернення
до колекції іншого типу.Цікаво, що для почергового звернення до вмісту
колекції в циклі foreach використовується також нумератор.
• З перелічувачем безпосередньо пов'язаний і ітератор. Цей засіб
спрощує процес створення класів колекцій, наприклад спеціальних,
почергове звернення до яких організовується в циклі foreach.
Інтерфейси
Інтерфейс IProducerConsumerCollection <T> був доданий у версію .NET 4 для підтримки нових, безпечних
щодо потоків класів колекцій.
IProducerConsumerCollection <T>
Інтерфейс IEqualityComparer <T> реалізований компаратором, який може бути застосований до ключів
словника. Через цей інтерфейс об'єкти можуть бути перевірені на предмет еквівалентності один
одному. В .NET 4 цей інтерфейс також реалізований масивами і кортежами.
IEqualityComparer <T>
Інтерфейс IComparer <T> реалізований компаратором і використовується для сортування елементів
усередині колекції за допомогою методу Compare ().
IComparer <T>
Подібно IDictionary <TKey, TValue> підтримує ключі і значення. Однак у цьому випадку колекція може
містити множинні значення для одного ключа.
ILookup <TKey, TValue>
Інтерфейс IDictionary <TKey, TValue> реалізується узагальненими класами колекцій, елементи яких
складаються з ключа і значення. За допомогою цього інтерфейсу можна отримувати доступ до всіх
ключам і значенням, витягувати елементи по індексатора типу ключа, а також додавати і видаляти
елементи.
IDictionary<TKey, TValue>
Інтерфейс ISet <T> з'явився у версії .NET 4. Цей інтерфейс реалізується множинами. Він дозволяє
комбінувати різні множини в об'єднання, а також перевіряти, чи не перетинаються дві
множини. ISet <T> успадкований від ICollection <T>.
ISet<T>
Інтерфейс IList <T> призначений для створення списків, елементи яких доступні по своїх позиціях.Цей
інтерфейс визначає індексатор, а також способи вставки і видалення елементів в певні позиції
(методи Insert () і Remove ()). IList <T> успадкований від ICollection <T>.
IList<T>
ICollection <T> – це інтерфейс, реалізований класами узагальнених колекцій. З його допомогою можна
отримати кількість елементів в колекції (властивість Count) і скопіювати колекцію в масив (метод
СоруТо ()). Можна також додавати і видаляти елементи з колекції (Add (), Remove (), Clear ()).
ICollection<T>
Інтерфейс IEnumerable необхідний, коли з колекцією використовується оператор foreach. Цей інтерфейс
визначає метод GetEnumerator (), який повертає Нумератор, який реалізує IEnumerator.
IEnumerable<T>
ОписІнтерфейс
Інтерфейси, що використовуються в колекціях C#
System.Collections.ObjectModel
• У просторі імен
System.Collections.ObjectModel
знаходиться також ряд класів, що
підтримують створення користувачами
власних узагальнених колекцій

More Related Content

What's hot

Презентація:Звичайні дроби (підсумковий урок)
Презентація:Звичайні дроби (підсумковий урок) Презентація:Звичайні дроби (підсумковий урок)
Презентація:Звичайні дроби (підсумковий урок) sveta7940
 
Урок 14 для 6 класу - Об'єкти презентації та засоби керування її демонстраціє...
Урок 14 для 6 класу - Об'єкти презентації та засоби керування її демонстраціє...Урок 14 для 6 класу - Об'єкти презентації та засоби керування її демонстраціє...
Урок 14 для 6 класу - Об'єкти презентації та засоби керування її демонстраціє...VsimPPT
 
центральні та вписані кути 12
центральні та вписані кути 12центральні та вписані кути 12
центральні та вписані кути 12den2002
 
рядки
рядкирядки
рядкиcit-cit
 
презентація елемент керування кнопка
презентація   елемент керування кнопкапрезентація   елемент керування кнопка
презентація елемент керування кнопкаСергій Каляфіцький
 
Пошук максимального елемента в масиві
Пошук максимального елемента в масивіПошук максимального елемента в масиві
Пошук максимального елемента в масивіЗоя Муляр
 
Презентація:Розв"язування вправ
Презентація:Розв"язування вправПрезентація:Розв"язування вправ
Презентація:Розв"язування вправsveta7940
 
Презентація:Множення і ділення раціональних чисел (повторення)
Презентація:Множення і ділення раціональних чисел (повторення)Презентація:Множення і ділення раціональних чисел (повторення)
Презентація:Множення і ділення раціональних чисел (повторення)sveta7940
 
Презентація:"Додавання і віднімання дробів з однаковими знаменниками"
Презентація:"Додавання і віднімання дробів з однаковими знаменниками"Презентація:"Додавання і віднімання дробів з однаковими знаменниками"
Презентація:"Додавання і віднімання дробів з однаковими знаменниками"sveta7940
 
дії з раціональними числами
дії з раціональними числамидії з раціональними числами
дії з раціональними числамиГергель Ольга
 
Презентація:Повторення теми "Додавання і віднімання раціональних чисел"
Презентація:Повторення теми "Додавання і віднімання раціональних чисел"Презентація:Повторення теми "Додавання і віднімання раціональних чисел"
Презентація:Повторення теми "Додавання і віднімання раціональних чисел"sveta7940
 
Презентація Бази даних Урок 1.pptx
Презентація Бази даних Урок 1.pptxПрезентація Бази даних Урок 1.pptx
Презентація Бази даних Урок 1.pptxssuserceb60a
 
Розгалуження в мові C++
Розгалуження в мові C++Розгалуження в мові C++
Розгалуження в мові C++Alexander Kuzmenko
 
відсоткові розрахунки
відсоткові розрахунки відсоткові розрахунки
відсоткові розрахунки asdfghj7
 
Презентація: Розв"язування квадратних рівнянь
Презентація: Розв"язування квадратних рівняньПрезентація: Розв"язування квадратних рівнянь
Презентація: Розв"язування квадратних рівняньsveta7940
 
Математика 6 клас
Математика 6 класМатематика 6 клас
Математика 6 класIgor Shuvarsky
 
масиви презентация
масиви презентациямасиви презентация
масиви презентацияAnna Kalinichenko
 

What's hot (20)

Презентація:Звичайні дроби (підсумковий урок)
Презентація:Звичайні дроби (підсумковий урок) Презентація:Звичайні дроби (підсумковий урок)
Презентація:Звичайні дроби (підсумковий урок)
 
Урок узагальнення 6 клас
Урок узагальнення 6 класУрок узагальнення 6 клас
Урок узагальнення 6 клас
 
Урок 14 для 6 класу - Об'єкти презентації та засоби керування її демонстраціє...
Урок 14 для 6 класу - Об'єкти презентації та засоби керування її демонстраціє...Урок 14 для 6 класу - Об'єкти презентації та засоби керування її демонстраціє...
Урок 14 для 6 класу - Об'єкти презентації та засоби керування її демонстраціє...
 
+2 типи даних в с++
+2 типи даних в с+++2 типи даних в с++
+2 типи даних в с++
 
центральні та вписані кути 12
центральні та вписані кути 12центральні та вписані кути 12
центральні та вписані кути 12
 
рядки
рядкирядки
рядки
 
презентація елемент керування кнопка
презентація   елемент керування кнопкапрезентація   елемент керування кнопка
презентація елемент керування кнопка
 
Пошук максимального елемента в масиві
Пошук максимального елемента в масивіПошук максимального елемента в масиві
Пошук максимального елемента в масиві
 
Презентація:Розв"язування вправ
Презентація:Розв"язування вправПрезентація:Розв"язування вправ
Презентація:Розв"язування вправ
 
Презентація:Множення і ділення раціональних чисел (повторення)
Презентація:Множення і ділення раціональних чисел (повторення)Презентація:Множення і ділення раціональних чисел (повторення)
Презентація:Множення і ділення раціональних чисел (повторення)
 
Презентація:"Додавання і віднімання дробів з однаковими знаменниками"
Презентація:"Додавання і віднімання дробів з однаковими знаменниками"Презентація:"Додавання і віднімання дробів з однаковими знаменниками"
Презентація:"Додавання і віднімання дробів з однаковими знаменниками"
 
дії з раціональними числами
дії з раціональними числамидії з раціональними числами
дії з раціональними числами
 
Презентація:Повторення теми "Додавання і віднімання раціональних чисел"
Презентація:Повторення теми "Додавання і віднімання раціональних чисел"Презентація:Повторення теми "Додавання і віднімання раціональних чисел"
Презентація:Повторення теми "Додавання і віднімання раціональних чисел"
 
Презентація Бази даних Урок 1.pptx
Презентація Бази даних Урок 1.pptxПрезентація Бази даних Урок 1.pptx
Презентація Бази даних Урок 1.pptx
 
Розгалуження в мові C++
Розгалуження в мові C++Розгалуження в мові C++
Розгалуження в мові C++
 
відсоткові розрахунки
відсоткові розрахунки відсоткові розрахунки
відсоткові розрахунки
 
рядки в C ++
рядки в C ++рядки в C ++
рядки в C ++
 
Презентація: Розв"язування квадратних рівнянь
Презентація: Розв"язування квадратних рівняньПрезентація: Розв"язування квадратних рівнянь
Презентація: Розв"язування квадратних рівнянь
 
Математика 6 клас
Математика 6 класМатематика 6 клас
Математика 6 клас
 
масиви презентация
масиви презентациямасиви презентация
масиви презентация
 

Similar to L10f

Тема 10. Стандарти ANSI ASC X12, ISO 11179. Підтримка стандарту Дублінського ...
Тема 10. Стандарти ANSI ASC X12, ISO 11179. Підтримка стандарту Дублінського ...Тема 10. Стандарти ANSI ASC X12, ISO 11179. Підтримка стандарту Дублінського ...
Тема 10. Стандарти ANSI ASC X12, ISO 11179. Підтримка стандарту Дублінського ...Oleg Nazarevych
 
Data Structures
Data StructuresData Structures
Data Structureseleksdev
 
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)Exoft LLC
 
sql introduction
sql introductionsql introduction
sql introductioneleksdev
 
лаб. роб. №2 обєкти та сервіси що ними надаються
лаб. роб. №2   обєкти та сервіси що ними надаютьсялаб. роб. №2   обєкти та сервіси що ними надаються
лаб. роб. №2 обєкти та сервіси що ними надаютьсяcit-cit
 
Advanced c sharp part 3
Advanced c sharp part 3Advanced c sharp part 3
Advanced c sharp part 3eleksdev
 
C++ Basics
C++ BasicsC++ Basics
C++ Basicseleksdev
 
змінна введення виведення даних
змінна введення виведення данихзмінна введення виведення даних
змінна введення виведення данихМикола Мізюк
 
Тема 2. Алгебраїчна система. Відображення логічних моделей даних у вигляді ал...
Тема 2. Алгебраїчна система. Відображення логічних моделей даних у вигляді ал...Тема 2. Алгебраїчна система. Відображення логічних моделей даних у вигляді ал...
Тема 2. Алгебраїчна система. Відображення логічних моделей даних у вигляді ал...Oleg Nazarevych
 
Kiyanchuk r
Kiyanchuk rKiyanchuk r
Kiyanchuk rgarasym
 
Net framework і c# module 3
Net framework і c# module 3Net framework і c# module 3
Net framework і c# module 3Andrii Hladkyi
 
Розроблення підсистеми трендів
Розроблення підсистеми трендівРозроблення підсистеми трендів
Розроблення підсистеми трендівПупена Александр
 
тема 7
тема 7тема 7
тема 7cit-cit
 

Similar to L10f (20)

l9
l9l9
l9
 
Тема 10. Стандарти ANSI ASC X12, ISO 11179. Підтримка стандарту Дублінського ...
Тема 10. Стандарти ANSI ASC X12, ISO 11179. Підтримка стандарту Дублінського ...Тема 10. Стандарти ANSI ASC X12, ISO 11179. Підтримка стандарту Дублінського ...
Тема 10. Стандарти ANSI ASC X12, ISO 11179. Підтримка стандарту Дублінського ...
 
Data Structures
Data StructuresData Structures
Data Structures
 
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
 
sql introduction
sql introductionsql introduction
sql introduction
 
лаб. роб. №2 обєкти та сервіси що ними надаються
лаб. роб. №2   обєкти та сервіси що ними надаютьсялаб. роб. №2   обєкти та сервіси що ними надаються
лаб. роб. №2 обєкти та сервіси що ними надаються
 
DAL
DALDAL
DAL
 
тематична
тематичнатематична
тематична
 
Advanced c sharp part 3
Advanced c sharp part 3Advanced c sharp part 3
Advanced c sharp part 3
 
C++ Basics
C++ BasicsC++ Basics
C++ Basics
 
змінна введення виведення даних
змінна введення виведення данихзмінна введення виведення даних
змінна введення виведення даних
 
ACM2020_Lecture1
ACM2020_Lecture1ACM2020_Lecture1
ACM2020_Lecture1
 
Тема 2. Алгебраїчна система. Відображення логічних моделей даних у вигляді ал...
Тема 2. Алгебраїчна система. Відображення логічних моделей даних у вигляді ал...Тема 2. Алгебраїчна система. Відображення логічних моделей даних у вигляді ал...
Тема 2. Алгебраїчна система. Відображення логічних моделей даних у вигляді ал...
 
8 11
8 118 11
8 11
 
Excel urok 03_tema
Excel urok 03_temaExcel urok 03_tema
Excel urok 03_tema
 
Kiyanchuk r
Kiyanchuk rKiyanchuk r
Kiyanchuk r
 
Урок 54 8 клас
Урок 54 8 класУрок 54 8 клас
Урок 54 8 клас
 
Net framework і c# module 3
Net framework і c# module 3Net framework і c# module 3
Net framework і c# module 3
 
Розроблення підсистеми трендів
Розроблення підсистеми трендівРозроблення підсистеми трендів
Розроблення підсистеми трендів
 
тема 7
тема 7тема 7
тема 7
 

Recently uploaded

Презентациія для сайта Група «Незабудка».pptx
Презентациія для сайта Група «Незабудка».pptxПрезентациія для сайта Група «Незабудка».pptx
Презентациія для сайта Група «Незабудка».pptxOlgaDidenko6
 
Іваніщук Надія Вікторівна атестація .pdf
Іваніщук Надія Вікторівна атестація  .pdfІваніщук Надія Вікторівна атестація  .pdf
Іваніщук Надія Вікторівна атестація .pdfhome
 
Супрун презентація_presentation_for_website.pptx
Супрун презентація_presentation_for_website.pptxСупрун презентація_presentation_for_website.pptx
Супрун презентація_presentation_for_website.pptxOlgaDidenko6
 
Відкрита лекція на тему «Контроль бур'янів в посівах соняшника»
Відкрита лекція на тему «Контроль бур'янів в посівах соняшника»Відкрита лекція на тему «Контроль бур'янів в посівах соняшника»
Відкрита лекція на тему «Контроль бур'янів в посівах соняшника»tetiana1958
 
Defectolog_presentation_for_website.pptx
Defectolog_presentation_for_website.pptxDefectolog_presentation_for_website.pptx
Defectolog_presentation_for_website.pptxOlgaDidenko6
 
Р.Шеклі "Запах думки". Аналіз оповідання
Р.Шеклі "Запах думки". Аналіз оповіданняР.Шеклі "Запах думки". Аналіз оповідання
Р.Шеклі "Запах думки". Аналіз оповіданняAdriana Himinets
 
Бомбочки для ванни своїми руками презентація
Бомбочки для ванни своїми руками презентаціяБомбочки для ванни своїми руками презентація
Бомбочки для ванни своїми руками презентаціяssuser0a4f48
 
Супрун презентація_presentation_for_website.pptx
Супрун презентація_presentation_for_website.pptxСупрун презентація_presentation_for_website.pptx
Супрун презентація_presentation_for_website.pptxOlgaDidenko6
 
psychologistpresentation-230215175859-50bdd6ed.ppt
psychologistpresentation-230215175859-50bdd6ed.pptpsychologistpresentation-230215175859-50bdd6ed.ppt
psychologistpresentation-230215175859-50bdd6ed.pptOlgaDidenko6
 
Проблеми захисту лісу в Україні та шляхи вирішення
Проблеми захисту лісу в Україні та шляхи вирішенняПроблеми захисту лісу в Україні та шляхи вирішення
Проблеми захисту лісу в Україні та шляхи вирішенняtetiana1958
 
Принципові відмінності досконалої (повної) конкуренції від інших форм організ...
Принципові відмінності досконалої (повної) конкуренції від інших форм організ...Принципові відмінності досконалої (повної) конкуренції від інших форм організ...
Принципові відмінності досконалої (повної) конкуренції від інших форм організ...JurgenstiX
 
Застосування Гайду безбар’єрності в роботі закладів культури громад Одещини.pdf
Застосування Гайду безбар’єрності в роботі закладів культури громад Одещини.pdfЗастосування Гайду безбар’єрності в роботі закладів культури громад Одещини.pdf
Застосування Гайду безбар’єрності в роботі закладів культури громад Одещини.pdfssuser15a891
 
Хімічні елементи в літературних творах 8 клас
Хімічні елементи в літературних творах 8 класХімічні елементи в літературних творах 8 клас
Хімічні елементи в літературних творах 8 класkrementsova09nadya
 
Горбонос 2024_presentation_for_website.pptx
Горбонос 2024_presentation_for_website.pptxГорбонос 2024_presentation_for_website.pptx
Горбонос 2024_presentation_for_website.pptxOlgaDidenko6
 
ЛЕКЦІЯ Засоби масової інформації –важливий інструмент ПР.ppt
ЛЕКЦІЯ Засоби масової інформації –важливий інструмент ПР.pptЛЕКЦІЯ Засоби масової інформації –важливий інструмент ПР.ppt
ЛЕКЦІЯ Засоби масової інформації –важливий інструмент ПР.pptssuser59e649
 
Бібліотека – розвиток дитячої творчості та дозвілля для дітейpptx
Бібліотека – розвиток дитячої творчості  та дозвілля для дітейpptxБібліотека – розвиток дитячої творчості  та дозвілля для дітейpptx
Бібліотека – розвиток дитячої творчості та дозвілля для дітейpptxssuserc301ed1
 
атестація 2023-2024 Kewmrbq wtynh GNJ.pdf
атестація 2023-2024 Kewmrbq wtynh GNJ.pdfатестація 2023-2024 Kewmrbq wtynh GNJ.pdf
атестація 2023-2024 Kewmrbq wtynh GNJ.pdfhome
 

Recently uploaded (17)

Презентациія для сайта Група «Незабудка».pptx
Презентациія для сайта Група «Незабудка».pptxПрезентациія для сайта Група «Незабудка».pptx
Презентациія для сайта Група «Незабудка».pptx
 
Іваніщук Надія Вікторівна атестація .pdf
Іваніщук Надія Вікторівна атестація  .pdfІваніщук Надія Вікторівна атестація  .pdf
Іваніщук Надія Вікторівна атестація .pdf
 
Супрун презентація_presentation_for_website.pptx
Супрун презентація_presentation_for_website.pptxСупрун презентація_presentation_for_website.pptx
Супрун презентація_presentation_for_website.pptx
 
Відкрита лекція на тему «Контроль бур'янів в посівах соняшника»
Відкрита лекція на тему «Контроль бур'янів в посівах соняшника»Відкрита лекція на тему «Контроль бур'янів в посівах соняшника»
Відкрита лекція на тему «Контроль бур'янів в посівах соняшника»
 
Defectolog_presentation_for_website.pptx
Defectolog_presentation_for_website.pptxDefectolog_presentation_for_website.pptx
Defectolog_presentation_for_website.pptx
 
Р.Шеклі "Запах думки". Аналіз оповідання
Р.Шеклі "Запах думки". Аналіз оповіданняР.Шеклі "Запах думки". Аналіз оповідання
Р.Шеклі "Запах думки". Аналіз оповідання
 
Бомбочки для ванни своїми руками презентація
Бомбочки для ванни своїми руками презентаціяБомбочки для ванни своїми руками презентація
Бомбочки для ванни своїми руками презентація
 
Супрун презентація_presentation_for_website.pptx
Супрун презентація_presentation_for_website.pptxСупрун презентація_presentation_for_website.pptx
Супрун презентація_presentation_for_website.pptx
 
psychologistpresentation-230215175859-50bdd6ed.ppt
psychologistpresentation-230215175859-50bdd6ed.pptpsychologistpresentation-230215175859-50bdd6ed.ppt
psychologistpresentation-230215175859-50bdd6ed.ppt
 
Проблеми захисту лісу в Україні та шляхи вирішення
Проблеми захисту лісу в Україні та шляхи вирішенняПроблеми захисту лісу в Україні та шляхи вирішення
Проблеми захисту лісу в Україні та шляхи вирішення
 
Принципові відмінності досконалої (повної) конкуренції від інших форм організ...
Принципові відмінності досконалої (повної) конкуренції від інших форм організ...Принципові відмінності досконалої (повної) конкуренції від інших форм організ...
Принципові відмінності досконалої (повної) конкуренції від інших форм організ...
 
Застосування Гайду безбар’єрності в роботі закладів культури громад Одещини.pdf
Застосування Гайду безбар’єрності в роботі закладів культури громад Одещини.pdfЗастосування Гайду безбар’єрності в роботі закладів культури громад Одещини.pdf
Застосування Гайду безбар’єрності в роботі закладів культури громад Одещини.pdf
 
Хімічні елементи в літературних творах 8 клас
Хімічні елементи в літературних творах 8 класХімічні елементи в літературних творах 8 клас
Хімічні елементи в літературних творах 8 клас
 
Горбонос 2024_presentation_for_website.pptx
Горбонос 2024_presentation_for_website.pptxГорбонос 2024_presentation_for_website.pptx
Горбонос 2024_presentation_for_website.pptx
 
ЛЕКЦІЯ Засоби масової інформації –важливий інструмент ПР.ppt
ЛЕКЦІЯ Засоби масової інформації –важливий інструмент ПР.pptЛЕКЦІЯ Засоби масової інформації –важливий інструмент ПР.ppt
ЛЕКЦІЯ Засоби масової інформації –важливий інструмент ПР.ppt
 
Бібліотека – розвиток дитячої творчості та дозвілля для дітейpptx
Бібліотека – розвиток дитячої творчості  та дозвілля для дітейpptxБібліотека – розвиток дитячої творчості  та дозвілля для дітейpptx
Бібліотека – розвиток дитячої творчості та дозвілля для дітейpptx
 
атестація 2023-2024 Kewmrbq wtynh GNJ.pdf
атестація 2023-2024 Kewmrbq wtynh GNJ.pdfатестація 2023-2024 Kewmrbq wtynh GNJ.pdf
атестація 2023-2024 Kewmrbq wtynh GNJ.pdf
 

L10f

  • 2. Рівні проектування цифрових систем • SW: Application • SW: C++ Boost • SW: C++ STL • SW: C++11 • SW: C++ • SW: C • SW: Assembler SW ------------------------------------------------------------------------------------------------------------------ • (TLM)HW: SystemC/SystemVerilog (Architecture, CE) HW • (RTL)HW: VHDL/Verilog (Logic Circuit, CE)(1) • HW: VHDL/Verilog (Logic Circuit, CE)(2) • HW: SPICE/Verilog (Physical Design, EE)(1) • HW: SPICE (Physical Design, EE)(2) • HW: SPICE/GDSII (Physical Design, EE-PD) type-in -------------------------------------------------------------------------------------------- • (DFM)HW: GDSII (Physical Design, EE-PD) type-out A || || || || || || || || || || || || || || || ||
  • 3.
  • 7. БібліотекаБібліотека STLSTL • Бібліотека стандартних шаблонів (БСШ- STL- standart template library) не входила у вихідну специфікацію С++, а була добавлена розробниками пізніше. • БСШ забезпечує загальноцільові, стандартні класи і функції, реалізовує найбільш важливі алгоритми і структури даних. Оскільки вона будується на основі класів-шаблонів, алгоритми, які в неї входять, можуть бути застосовані практично до будь-яких типів даних, які допускаються в С++. • Використання засобів БСШ дозволяє суттєво підвищити надійність програм, їх універсальність, а також суттєво зменшити терміни розробки програм. • Ядро БСШ складають три основні елементи: 1. контейнери, 2. aлгоритми, 3. ітератори. • Ці елементи взаємно функціонують, забезпечуючи при цьому вирішення поставлених задач.
  • 8. ДДодатковіодаткові методиметоди • Додатково до контейнерів, алгоритмів та ітераторів у STL підтримується ще декілька стандартних компонентів. Головними серед них є розподільники пам’яті (allocators), предикати (predicates) та функції порівняння (comparison functions). • У кожного контейнера є визначений для нього розподільник пам’яті або алокатор. Алокатори керують процесом розподілу пам’яті. По замовчуванню розподільником пам’яті є об’єкт класу allocator, який оголошений у ФЗ <memory.h>. Конструктор цього класу генерує виклик функції побудованої на основі шаблону allocate з цього ж ФЗ. Наведемо прототип цієї функції-шаблону  template <class T> inline T* allocate (int size, T*); • Тут T - тип одного елемента-блока; size - кількість блоків. Повертає шаблон адресу виділеної через оператор new пам’яті. • У більшості випадків достатньо розподільника, який задається по замовчуванні,але можна визначити і власний розподільник пам’яті. • В деяких алгоритмах і контейнерах використовуються функції особливого типу, які називаються предикатами. Предикат може бути бінарним або унарним. Унарний предикат має один аргумент, бінарний- два. Аргументи бінарного предикату завжди розташовані по-порядку. Тип аргументів предикатів відповідає типу об’єктів, які зберігаються в контейнері. • Повертають предикати булівське значення. Проте точні умови повернення значення предикатом повинні визначатись розробником. Як правило, існує два типи для оголошення предикатів: UnPred - для унарного і BinPred- для бінарного. • В деяких алгоритмах і класах використовується спеціальний тип бінарного предиката, який призначений для порівняння двох елементів контейнера. Такий предикат називається функцією порівняння. Функція порівняння повертає істину, якщо її перший аргумент менший за другий. • Найбільш поширеним предикатом є функція порівняння двох елементів Comp, яка повертає true при умові, що перший елемент менший за другий.
  • 9. ККooнтейнеринтейнери • Контейнери (containers) - це об’єкти, які призначені для зберігання інших об’єктів. Контейнери бувають різних видів. Так у класі-шаблоні vector визначається динамічний масив, а в класі list - лінійний список. Загалом БСШ містить контейнери, які реалізовують основні структури даних, які використовуються при написанні програм - вектори, двонаправлені черги, списки і ії різновиди, словники (пари) і множини. • Умовно контейнери можна розбити на два типи: послідовні і асоціативні. • Послідовні контейнери (serial containers) забезпечують зберігання скінченного числа однотипних елементів у вигляді неперервної послідовності. До таких контейнерів відносять вектори, двонаправлені черги і списки, а також так звані адаптери, тобто контейнери, які реалізовують стеки, черги і черги з пріоритетами. • Асоціативні контейнери (associative containers) дозволяють за допомогою ключів (keys) отримати швидкий доступ до значень, які зберігаються у контейнері. Наприклад, у класі map визначається асоціативний список, який забезпечує доступ до значень за допомогою унікальних ключів. Тобто в асоціативних списках зберігаються пари ключ/значення, що дозволяє при наявності ключа отримати відповідне значення. • Існує п’ять типів асоціативних контейнерів: словники (набори пар), словники з дублюванням або пари з не унікальними ключами, множини, не унікальні множини і бітові множини (масиви, набори). • Синтаксично контейнер є класом-шаблоном. Ці шаблони забезпечують стандартизований інтерфейс для різних контейнерів. • Оскільки імена типів елементів, які входять в оголошення класу-шаблону можуть бути найрізноманітнішими, то у контейнерах за допомогою зарезервованого слова typedef оголошуються деякі узгоджені версії цих типів. Це дозволяє конкретизувати імена типів. • У кожному контейнері визначений набір функцій для роботи з цим контейнером. Так, наприклад, список містить функції для вставлення, знищення і об’єднання елементів. В контейнері стек є функції для розміщення елемента і виштовхування його з контейнера. #include <iostream> #include <vector> using namespace std; vector<int> mas; main(){ cout<<"Введіть розмір масиву "; int sz; cin>>sz; int val; for(int i=0;i<sz;i++) { cout<<"Введіть "<<i<<" елемент"; cin>>val; // додавання елементів в масив mas.push_back(val); } cout<<"Перший елемент: "<<mas[0]; }
  • 10. НабірНабір контейнерівконтейнерів STLSTL <vector>векторvector <stack>стекstack <set>множина унікальних елементівset <queue>чергаqueue <queue>черга з пріорітетомpriority_queue <set>множина елементівmultiset <map>асоціативний список для зберігання пар ключ/значення. З одним ключем може бути зв'язано декілька значень multimap <map>асоціативний список для зберігання пар ключ/значення. З одним ключем зв'язано лише одне значення map <list>лінійний списокlist <deque>двостороння чергаdeque <bitset>набір бітівbitset ФЗОписКонтейнер
  • 11. СписокСписок типівтипів STLSTL Узгоджене ім'я типу Опис size_type Інтегральний тип, еквівалентний типу size_t reference Посилання на елемент const_reference Постійне посилання iterator Ітератор const_iterator Постійний ітератор reverse_iterator Зворотній ітератор const_reverse_iterator Постійний зворотній ітератор value_type Тип значення в контейнері allocator_type Тип розподільника пам’яті (алокатора) key_type Тип ключа key_compare Тип порівняння двох ключів value_compare Тип порівняння двох значень
  • 12. ПослідовніПослідовні контейнериконтейнери • Вектор (vector), черги, двонаправлена чергa (deque), стек (stack) і список (list) складають набір послідовних контейнерів STL. • Вони підтримують різні набори операцій (методів), серед яких є такі що збігаються. Операція Метод vector deque list Вставка напочаток push_front() - + + Видалення з початку pop_front() - + + Вставка в кінець push_back() + + + Видалення з кінця push_front() + + + Вставка в довільному місці insert() + + + Видалення з довільного місця erase() + + + Довільний доступ до елемента [] . At + + - Кількість елементів size() + + + Максимальний розмір контейнера max_size() + + + Булівська функція, яка визначає чи контейнер є порожнім empty() + + +
  • 13. КонтейнерКонтейнер векторвектор ((vectorvector)) • Контейнер веrтор (vector) - це структура, яка ефективно реалізовує прямий доступ до елементів, додавання і знищення з кінця. В контейнері vector підтримуються динамічні масиви, тобто масиви, розміри яких можуть збільшуватись за потребою. • Виділення фіксованого розміру пам’яті для масиву є більш ефективним. Водночас, воно є і найбільшим обмеженням, оскільки не дозволяє адаптувати масив до змін, які виникають під час виконання програми. Вирішенням цієї проблеми є використання контейнера вектор, який виділяє пам’ять під масив по мірі потреби. Незважаючи на те, що вектор за своєю природою є динамічним масивом, для доступу до його елементів можна використовувати звичайну операцію індексації. • Для будь-якого об’єкта, який зберігається у векторі повинен бути визначений конструктор по замовчуванню. Окрім цього, повинні бути визначені також оператори порівняння < і == (для вбудованих типів усі вказані вимоги задовільняються автоматично). • Специфікація шаблону-класу vector має вид: • template<class T, class Allocator = allocator<T>>class vector; Тут T - тип значень (шаблонний тип), які будуть зберігатись у контейнері vector. Зарезервоване слово Allocator визначає розподільник пам’яті, який по замовчуванню є стандартним. • В класі vector є такі конструктори: 1. explicit* vector (const Allocator& a = Allocator()); 2. explicit vector (size_type n, const T& значення = T(), const Allocator &a = Allocator()); 3. vector (const vector<T, Allocator>& об’єкт); 4. template<class InIter>vector (InIter початок, InIter кінець, const Allocator &a=Allocator()) • Перша форма є конструктором порожнього вектора. • Друга форма створює вектор довжиною n елементів, кожен з яких елемент рівний значенню. Параметр значення приймає аргумент по замовчуванні, який для вбудованих типів є нульовим значенням. Для користувацьких типів значення аргумента по замовчуванні визначається конструктором без параметрів для даного типу. • Третя форма є конструктором копіювання. • Четверта форма - це конструктор вектора, який створює вектор шляхом копіювання вказаного за допомогою ітераторів діапазону значень. #include <vector> using namespace std; class A { public: int i; A(){i=0;} A(int i){A::i=i;} }; vector<int> v1; //1-форма vector<int> v2(5); //2-форма vector<int> v3(5,4); //2-форма vector<int> v4=v3; //3-форма vector<int> v5(v3); //3-форма vector<int> v6(v2.begin(),v2.begin()+2);//4-форма vector<A> v7(3); //2-форма vector<A> v8(3, A(4)); //2-форма
  • 14. ОператориОператори контейнераконтейнера vectorvector • Для класу vector визначені оператори:  оператор присвоєння = :  vector<T>& operator= (const vector<T>&);  оператор (функція-шаблон) порівняння на рівність == (рівність забезпечується рівністю усіх відповідних пар елементів):  template <class T> bool operator== (const vector<T>&, const vector <T>&);  оператор (функція-шаблон) порівняння на меньше < (один вектор вважається меншим від іншого, якщо перший з елементів одного вектора є меншим від відповідного елемента другого):  template <class T> bool operator< (const vector<T>&, const vector <T>&);  оператор індексації [] :  reference operator[] (size_type);  const_reference operator[] (size_type) const; • Окрім наведених визначено також операції !=, <=.
  • 15. МетодиМетоди доступудоступу додо елементівелементів контейнераконтейнера векторавектора • Методи доступу до елементів вектора (окрім оператора []) :  доступ до елементів вектора з перевіркою виходу за границю вектора (оператор індексації такої перевірки не здійснює). У випадку виходу за границю контейнера генерується КС out_range  reference at(size_type n);  const_reference at(size_type n) const;  вибірка першого елемента (посилання на елемент) контейнера  reference front();  const_reference front() const;  вибірка останнього елемента контейнера  reference back();  const_reference back() const;
  • 16. МетодиМетоди управлінняуправління обсягомобсягом контейнераконтейнера vectorvector • визначення розміру контейнеру  size_type size() const; • визначення максимально допустимого розміру контейнеру  size_type max_size() const; • зміна розміру контейнеру. Перший параметр задає новий розмір, другий параметр - значення, які, у випадку збільшення розміру, будуть присвоюватись новим елементам контейнера. Нові елементи будуть додаватись в кінець • void resize (size_type,T c = T()); • визначення розміру пам’яті, яку займає контейнер  size_type capacity() const; • перевірка чи контейнер порожній  bool empty() const; • задання розміру пам’яті для контейнера  void reserve(size_type);
  • 17. МетодиМетоди змінизміни обоб’’єктівєктів контейнераконтейнера vectorvector • додавання нового елемента в контейнер (в кінець)  void push_back(const T&); • знищення останнього елемента в контейнері  void pop_back(); • додавання елемента, який задається другим параметром в контейнер в позицію, яка вказана першим параметром  iterator insert (iterator, const T& = T());  додавання n однакових елементів в позицію, яка вказана першим параметром  void insert(iterator, size_type n, const T& = T());  додавання елементів з діапазону, який задається другим та третім параметрами, в позицію, яка вказана першим параметром  template <class InputIterator> void insert(iterator, InputIterator, InputIterator); • знищення елемента, який адресується параметром  void erase(iterator); • знищення елементів з діапазону, який задаєтьяс параметрами  void erase(iterator, iterator); • обмін елементами двома контейнерами  void swap(vector<T>&); • копіювання елементів, яке є аналогічне діє конструкторів другої та третьої форми  template <class InputIterator> void assign(InputIterator first, InputIterator last);  template <class Size, class T> void assign(Size n, const T& t = T());
  • 18. ПрикладПриклад контейнераконтейнера vectorvector #include <vector> #include <iostream> using namespace std; // створити вектор нульової довжини vector<int> v; int main() { int i; for(i=0; i<10; i++) // додати елементи у вектор v.push_back(i); cout<<"Розмір: "<<v. size() <<endl; for(i=0; i<v.size(); i++) // вивід елементів вектора cout<<i<<"-ий елемент"<<v[i]<<endl; //ітератор на початок vector<int>::iterator p=v.begin(); // ітератор на третій елемент p+=2; // вставити 10 елементів рівних 0 v.insert(p, 10, 0); p=v.begin(); p+=4; // знищити починаючи з 5-го 2 елемента v.erase(p, p+2); v.begin(); while(p!=v.end()) { // вивід вмісту вектора через ітератор cout<<*p<<" "; p++; }; return 0;
  • 19. АсоціативніАсоціативні контейнериконтейнери • Як вже відзначалось, асоціативні контейнери забезпечують швидкий доступ до даних за рахунок того, що вони побудовані на основі збалансованих дерев пошуку (стандартом регламентується тільки інтерфейс контейнера, а не їх реалізація). • Асоціативні контейнери залежать від двох параметрів - Key (ключ) і Compare (відношення повного впорядкування за ключем Key) . Контейнери set і multiset є “виродженими” асоціативними контейнерами, у яких значення не є особливо важливими - усі операції здійснюються за допомогою ключів. Контейнер шаблону set повинен складатись із унікальних ключів, а multiset - допускає дублювання ключів. • Контейнери типу map і multimap елементами є пари значень, які складаються з об’єктів шаблонного типу T, які, у свою чергу, зв’язані з об’єктами типу Key. • Для зберігання пари “ключ-елемент” використовується шаблон pair, який описаний у ФЗ <utility>. template <class T1, class T2> struct pair { typedef T1 first_type; typedef T2 second_type; T1 first; T2 second; pair (const T1& x, const T2& y); template <class U, class V> pair(const pair<U,V>& p); }; • Ітератори асоціативних контейнерів є двонапавленими. Оператори вставляння не впливають на коректність ітераторів і посилання на елементи контейнера, а операція видалення анулює лише ітератори та посилання на видалені елементи Окрім того, ітератори асоціативних контейнерів пересуваються по елементах контейнера лише в порядку зростання ключів. • Існуть такі асоціативні контейнери:  унікальні словники (map),  словники (multimap),  унікальні множини (set),  множини (multiset),  бітові множини (bitset).
  • 20. Операції, які є спільними для усіх асоціативних контейнерів Конструктори AssociativeContainer () Створює порожній контейнер AssociativeContainer (const Comparison& с) Створює порожній контейнер із заданим відношенням порівняння AssociativeContainer (i, j) Створює контейнер ініціалізований діапазоном [i,j] AssociativeContainer (i, j, с) Створює контейнер ініціалізований діапазоном [i,j] із заданим відношенням порівняння Доступ до елементів контейнера iterator find(key) Здійснює пошук елемента за задним ключем, повертає ітератор на шуканий елемент const-iterator find(key) iterator lower_bound(key) Повертає ітератор на перший знайдений за заданим ключем елемент const iterator lower_bound(key) iterator upper_bound(key) Повертає ітератор на наступний від знайденого за заданим ключем елемент, ключ якого є більшим від ключа знайденого елемента const iterator upper_bound(key) pair<iterator, iterator> equal_range(key) Повертає пару ітераторів на перший та останній елементи, ключі яких рівні заданому size_t count(key) Повертає кількість елементів, які мають заданий ключ Вставляння і видалення pair<iterator,bool> insert(t) Вставляє елемент t. Повертає пару, яка складється з ітератора, який посилається на елемент, що вставлявся, та логічне значення (true — вставляння виконане, false — вставляння не виконане) void insert(i,j) Вставляє в контейнер діапазон [i,j] void erase(pos) Видаляє елемент, на який посилається ітератор pos size_t erase(key) Видаляє елемент, який має ключ key void erase(i,j) Видаляє діапазон [i,j]
  • 21. Контейнер map • Контейнер map - унікальний словник, або набір унікальних пар або асоціативний список. • Словник будується на основі пар значень. Перше значення є ключем для індентифікації пари, а друге - саме значенням. • Ключем може бути значення будь-якого типу. Але в контейнері map він є унікальним. • Типовий заголовок шаблону map може бути таким  template <class Key, class T, class Compare = less<Key> class Allocator = allocator<pair<const Key, T>> > class map; • Конструктори деструктор : 1. explicit map(const Compares comp = Compare(), const Allocator&= Allocator()); 2. template <class Inputlterator> map(Inputlterator first, Inputlterator last, const Compares: comp = Compared, const Allocators = Allocator()); 3. map (const map<Key, T, Compare, Allocator>&); 4. ~map(); • Перша форма конструктора створює порожній словник. • Друга форма створює асоціативний список через задавання початку і кінця діапазона, а також функцію присвоєння  map<Key,T,Compare,Allocator>& operator=(const map<Key,Т,Compare,Allocator>& x); • Цей конструктор створює асоціативний список та ініціалізує його елементами x. • Третя форма є конструктором копії. • І, нарешті, шаблон map має деструктор, який знищує словник у пам’яті.
  • 22. Операції над контейнером map • зміна і визначення розміру об’єкта:  визначення кількості елементів у словнику – size_type size() const;  визначення максимально кількості елементів у словнику – size_type max_size() const;  перевірка чи масив є порожнім. Якщо так, то повертається true. В противному випадку - false. – bool empty() const; • оператор доступу:  доступ до елементів асоціативного списку забезпечується операторм індексації – operator[](const key_type& x); • операції вставляння: • Вставляння елементів у словник здійснюється такими методами:  вставляння елементу у контейнер і повернення пари, яка складається з ітератора і булівського значення. Оскільки об’єкт шаблону map не допускає дублювання, то пара, яка повертається дозволяє визначити успішність виконання операції, яка здійснюється. Якщо у словнику не існувало елемента із заданим ключем, то булівська змінна (у парі, яка повертається) буде містити значення true, а ітератор буде посилатись на вставлений елемент. Решту варіантів функції insert() не дозволяють з’ясувати чи виконане вставляння – pair<iterator, bool> insert(const value_type& x) ;  вставляння елемента перед елементом, на який посилається ітератор position – iterator insert(iterator position, const value_type& x);  вставляння діапазона елементів, який визначається ітераторами first та last – template <class Inputlterator> void insert(InputIterator first, Inputlterator last); • операції знищення:  знищення елемента, на який посилається ітератор position – void erase(iterator position);  знищення елемента по заданому ключу – size_type erase (const key_type& x) ;  заміна місцями елементів словника, який викликає метод, і аргумента – void swap(map<Key, Т, Compare, Allocators);  очищення словника (видалення усіх елементів) – void clear();
  • 23. Операції над контейнером map • функтори порівняння:  повертання функтора, який порівнює ключі – key_compare key_comp() const;  повертання функтора, який порівнює значення – value_compare value_comp()const; • операції пошуку:  метод find()повретає ітератор, який встановлений на шукане значення. Якщо шуканого значення не знайдено, то повертатиметься ітератор, який встановлений на значення поза межами контейнера. Пошук здійснюється за ключем – iterator find(const key_type& x); – const_iterator find(const key_type& x) const;  повертання кількості елементів, які мають заданий ключ – size_type count(const key_type& x) const;  повертання ітератора, який посилається на початок послідовності елементів, що мають заданий ключ – iterator lower_bound(const key_type& x); – iterator lower_bound(const key_type& x) const;  повертання ітератора, який посилається на кінець послідовності елементів, що мають заданий ключ – iterator upper_bound(const key_type& x); – iterator upper_bound(const key_type& x) const;  повертання пари, яка складається із ітераторів, які посилається на початок та кінець послідовності елементів, що мають заданий ключ – pair<iterator,iterator> equal_range(const key_type& x); – pair<iterator,iterator> equal_range(const key_type& x) const;
  • 24. Операції порівняння контейнера map • оператор перевірки рівності двох словників. У випадку, якщо словники x і y складаються з однакових елементів, то повертає значення true. Операція порівняння задається функтором Compare – template <class Key, class T, class Compare, class Allocator> bool operator< (const map<Key,T, Compare, Allocators x, const map<Key,T, Compare, Allocators y); • оператор перевірки нерівності “менше” двох словників. У випадку, якщо словник x є меншим від словника y , то повертає значення true. Операція порівняння задається функтором Compare – template <class Key, class Т, class Compare, class Allocator> bool operator!= (const map<Key, T, Compare, Allocators x, const map<Key,T, Compare, Allocators y) ; • оператор перевірки рівності двох словників. У випадку, якщо словники x і y складаються з неоднакових елементів, то повертає значення true. Операція порівняння задається функтором Compare – template <class Key, class T, class Compare, class Allocator> bool operator ! = (const map<Key,T, Compare, Allocators x, const map<Key,T, Compare, Allocators y) ; • оператор перевірки нерівності “більше” двох словників. У випадку, якщо словник x є більшим від словника y , то повертає значення true. Операція порівняння задається функтором Compare – template <class Key, class Т, class Compare, class Allocator> bool operator> (const map<Key,T,Compare, Allocators x, const map<Key,T,Compare, Allocators y); • оператор перевірки нерівності “більше рівне” двох словників. У випадку, якщо словник x є більшим або рівним словнику y , то повертає значення true. Операція порівняння задається функтором Compare – template <class Key, class T, class Compare, class Allocator> bool operator>=(const map<Key,T,Compare, Allocators x, const map<Key, T, Compare, Allocators y); • оператор перевірки нерівності “менше рівне” двох словників. У випадку, якщо словник x є меншим або рівним словнику y , то повертає значення true. Операція порівняння задається функтором Compare – template <class Key, class T, class Compare, class Allocator> bool operator<=(const map<Key,T,Compare, Allocators x, const map<Key,T,Compare, Allocators y); • зміна місцями елементів словників x та y. – template <class Key, class T, class Compare, class Allocator> void swap (map<Key, T, Compare, Allocators x, map<Key, T, Compare, Allocators y);
  • 25. Приклад контейнера map #include <iostream> #include <map> #include <string> using namespace std; typedef map<int, char*, less<int> > MAP; void print(MAP &Map); void reverse_print(MAP &Map); int main() { const int SIZE = 5; char* NUMBERS[]={"One", "Two", "Three", "Four", "Five"}; int i; MAP::iterator where, newWhere; // Порожні словники MAP Map, newMap; // Заповнення словника через функцію insert() for (i = 0; i < SIZE; i++) { Map.insert(MAP::value_type(i,NUMBERS[i])); newMap.insert(MAP::value_type(i,NUMBERS[i])); } printf("Словник Mapn"); print(Map); printf("Словник newMapn"); print(newMap); // Вивід вмісту словника у зворотньому порядку printf("Словник Map у зворотньому порядкуn"); reverse_print(Map); printf("Словник newMap у зворотньому порядкуn"); reverse_print(newMap); // Вивід на екран розмірів словників int MapSize = Map.size(); printf("Розмір словника Map = %dn", MapSize); MapSize = newMap.size(); printf("Розмір словника newMap = %dn", MapSize); // Вивід на екран максимальних розмірів словників MapSize = Map.max_size(); printf("Максимальний розмір масиву Map = %dn", MapSize); MapSize = newMap.max_size(); printf("Макс. розмір масиву newMap = %dn", MapSize); // Вивід на екрант кількості п'ятірок MapSize = Map.count(5); printf("Кількість п'ятірок у наборі Map = %dn", MapSize); MapSize = newMap.count(4); printf("Кількість 5 у наборі newMap = %dn", MapSize); // Шукаємо і видаляємо трійку в Map where = Map.find(3); Map.erase(where) ; printf("Словник Map після видалення трійкиn"); print(Map); // Видалення двох останніх елементів Map where = Map.find(2); Map.erase (where, Map.end() ); printf("Словник Map після видалення двох останніх елементівn"); print(Map); // Очищаємо Map за допомого функції clear() Map.clear(); printf("Спроба вивести порожній словник n"); print(Map); // Заповнюємо Map за допомогою методу insert // Дублювання не допускається for (i =0; i < 10; i++) { if(i<2) Map.insert(MAP::value_type(2,"Two")); if(i<2 && i< 5) Map.insert(MAP::value_type(7,"Seven")); if(i>5) Map.insert(MAP::value_type(10,"Ten")); } printf("Новий словник Марn"); print(Map); // Перестановка словників swap(Map, newMap); printf("Словник Map після обмінуn"); print(Map); printf ("Словник newMap після обмінуn"); print(newMap); // Діапазон, який складається з десяток printf("Діапазон, який складається з десятокn"); for (where=newMap.lower_bound(10) ; where != newMap.end(); where++) printf("(%d, %s) ", (*where).first, (*where).second); printf("n"); // Діапазон, який складається з двійок printf("Діапазон, який складається з двійокn"); for (where=newMap.begin(); where!= newMap.upper_bound(2); where++) printf("(%d, %s) ",(*where).first,(*where).second); printf("n"); // Діапазон, який складається з cемірок printf("Діапазон, який складається з cемірокn"); for (where=newMap.equal_range(7).first; where!= newMap.equal_range(7).second; where++) printf("(%d, %s) ",(*where).first,(*where).second); printf("n"); // Звертання до елементів словника // через метод operator[] () printf ("operator [ ] n"); for(where=newMap.begin(); where!=newMap.end(); where++) printf("(%d, %s) ",*where, newMap[(*where).first]); printf ("n"); // Порівняння словників if (Map == newMap) printf("Map == newMapn"); if(Map > newMap) printf("Map > newMapn"); if(Map >= newMap) printf("Map >= newMapn"); if(Map < newMap) printf("Map < newMapn"); if(Map <= newMap) printf("Map <= newMapn"); return 0; } void print(MAP &Map) { if (Map.empty()) { printf("%s n","Словник є порожнім"); return; } MAP::iterator i; for(i = Map.begin(); i != Map.end(); i++) printf("(%d, %s) ",(*i).first,(*i).second); printf ("n"); } void reverse_print(MAP &Map) { if (Map.empty()) { printf ("%s n", "Словник є порожнім"); return; } MAP::reverse_iterator i; for(i = Map.rbegin(); i!=Map.rend(); i++) printf ("(%d, %s) ", (*i) .first, (*i) .second) ; printf("n") ; }
  • 26. Алгоритми • Алгоритми (algorithms) виконують операції над вмістом контейнера (тобто над об’єктами контейнера). • Існують найрізноманітніші алгоритми - від ініціалізації до заміни вмісту контейнера. Окрім цього, вони дозволяють одночасно працювати з двома контенерами різних типів. Багато алгоритмів призначені для роботи з послідовністю, яка є лінійним списком елементів всередині контейнера. • Хоча кожен контейнер і підтримує власний набір операцій, проте існує набір стандартних алгоритмів, які забезпечують більш широкі і комплексні дії. Використання стандартних алгоритмів пов’язане з необхідністю підикання ФЗ <algorithm.h>. • Усі алгоритми з <algorithm. h> є функціями-шаблонами. Це дає можливість використовувати їх з контейнерами будь-яких типів. Наведемо приклад використання алгоритму, наприклад count. Його реалізація в середовищі Borland C++ відрізняєтьтся від реалізації у специфікації Standart C++. А тому приведемо прклади для обох версій мови. • Прототип алгоритму count у версії Standart C++ має вигляд  template <class InIter, class T> size_t count(InIter початок, InIter кінець, const T& значення); • Третій параметер значення є параметром на рівність якому порівнються усі елементи контейнера, а їх кількість повертається алгоритмом. #include <iostream> #include <vector> using namespace std; vector<int> mas; main(){ cout<<"Введіть розмір масиву "; int sz; cin>>sz; int val; for(int i=0;i<sz;i++){ cout<<"Введіть "<<i<<" елемент"; cin>>val; mas.push_back(val); // додавання елементів в масив } int n = count(mas.begin(),mas.end(),1); cout<<"Кількість елементів рівних 1 є "<<n; }
  • 27. КатегоріїКатегорії алгоритмівалгоритмів for_each sort сору find stable_sort copy_backward find_end partial_sort swap_ranges find_if partial_sort_copy swap find_first_of nth_element iter_swap adjacent_find lower_bound transform count upper_bound replace count_if equal_range replace_if mismatch binary_search replace_copy equal merge replace_copy_if search inplace_merge fill search_n includes fill_n set_union generate set_intersection generate_n accumulate set_difference remove inner_product set_symmetric_difference remove_if partial_sum make_heap remove_copy adjacent_difference push_heap remove_copy_if pop_heap unique sort_heap unique_copy min reverse max reverse_copy min_element rotate max_element rotate_copy lexicographical_compare random_shuffle next_permutation partition prev_permutation Алгоритми сортування та пошуку Алгоритми, які не змінюють вміст контейнерів Модифікуючі алгоритми Чисельні алгоритми
  • 29. ІтераториІтератори• Ітератори (iterators) - об’єкти, які по відношенню до контейнерів відіграють роль вказівників. Вони дозволяють отримати доступ до елементів контейнерів, аналогічно як вказівники використовуються для доступу до елементів масиву. • Доступ до поточного елемента контейнера, подібно до вказівників, здійснюється за операцій * і ->. Перехід до наступного елемента - за допомогою операції інкремента. Для усіх ітераторів визначені також операції присвоєння, перевірка на рівність і нерівність. • Типом ітераторів оголошується тип iterator, який є визначеним у ФЗ <iterator>. Окрім цього типу у ФЗ <iterator> описуються також ітераторні класи і функції. При використанні стандартних контейнерів цей ФЗ підмикається автоматично. • Існує п’ять основних типів ітераторів (їх список наведений в таблиці). Ітератор RandIter не підтримується контейнером list. Решта контейнерів підтримують ітератори усіх типів. • Бібліотека STL підтримує також так звані зворотні ітератори (reverse iterators). Цими ітераторами можуть бути або bidirectional або random access ітератори, які проходить послідовність елементів як у прямому так і у зворотньому напрямках. Якщо зворотній ітератор вказує на останній елемент послідовності, то його інкремент (++) приведе до вказування на передостанній. #include <iostream> #include <vector> using namespace std; vector<int> mas; main(){ cout<<"Введіть розмір масиву "; int sz; cin>>sz; int val; for(int i=0;i<sz;i++){ cout<<"Введіть "<<i<<" елемент"; cin>>val; mas.push_back(val); // додавання елементів в масив } vector<int>::iterator p=mas.begin(); for(;p<mas.end();p++) cout<<" Елемент="<<*p; } Ітератор Опис Термін Довільного доступу (random access) Використовується для зчитування та запису значень. Доступ до елементів довільний. RandIter Двонаправлений (bidirectional) Використовується для зчитування та запису значень. Може проходити контейнер в обох напрямках. BiIter Однонаправлений (forward) Використовується аналогічно. Може проходити контейнер лише в одному напрямку. ForIter Вводу (input) Використовується для зчитування значень. Може проходити контейнер лише в одному напрямку. InIter Виводу (output) Використовується для запису значень. Може проходити контейнер лише в одному напрямку. OutIter  Ітератори можуть бути постійними. Такі ітератори використовуються тоді, коли треба заборонити зміну елемнтів в контейнері.  Якщо ітератор вказує на конкретний елемент контейнера, то він вважається дійсним (ініціалізованим). В противному випадку - недійсним (неініціалізованим). Ітератор може бути недійсним в таких випадках:  ітератор не був ініціалізований;  контейнер, з яким був зв’язаний ітератор, змінив розміри, або був знищений;  ітератор вказує на кінець послідовності. Кінець послідовності елементів контейнера є вказівником на елемент, який слідує за останнім елементом послідовності. Цей вказівник існує завжди. Такий підхід дозволяє не розглядати порожню послідовність елементів як особливий випадок. Поняття “нульовий” ітератор не існує. Ітератори утворють певну ієрархію в порядку їх оголошення в таблиці. Очевидно, що ітератор з більшими можливостями (який стоїть вище в ієрархії) може використовуватись замість ітератора з меншими. Наприклад однонаправлений ітератор може замінити ітератор вводу (тут мається на увазі ввід/вивід значень у контейнери).
  • 31. Boost • Boost — набір бібліотек, які розширюють функціональність C++. • Вільно поширюються за ліцензією Boost Software License разом з сирцевим кодом. • Бібліотеки boost є кандидатами на включення в наступний стандарт C++. • Деякі бібліотеки boost були включені стандарт C++ ще в 2011 році. • При включенні бібліотеки в boost вона проходить кілька етапів рецензування. • Має власну систему “збирання” (Boost Build). • У сучасній версії (1.66) в boost більше сотні бібліотек. • Сирцевий код і документація доступні на https://www.boost.org .
  • 32. Категорії бібліотеки Boost • String and text processing • Containers • Iterators • Algorithms • Function objects and higher-order programming • Generic Programming • Template Metaprogramming • Concurrent Programming • Math and numerics • Correctness and testing • Data structures • Domain Specific • System • Input/Output • Memory • Image processing • Inter-language support • Language Features Emulation • Parsing • Patterns and Idioms • Programming Interfaces • State Machines • Broken compiler workarounds • Preprocessor Metaprogramming
  • 33. any
  • 36. bind
  • 44. ASIO
  • 45. ASIO
  • 47. Іспит: (42 + 42) / 2 + (28 V 28) * kзахист
  • 48. Д.З. №1 • Вивести на екран в конструкторі класу ClassA власне прізвище. Пояснити різницю в роботі коду, що був скомпільований різними версіями компілятора. sh-4.4$ g++ -std=c++17 -o main *.cpp sh-4.4$ main + + sh-4.4$ g++ -std=c++14 -o main *.cpp sh-4.4$ main + + sh-4.4$ g++ -std=c++11 -o main *.cpp sh-4.4$ main + + sh-4.4$ g++ -std=c++0x -o main *.cpp sh-4.4$ main + + sh-4.4$ g++ -std=c++03 -o main *.cpp sh-4.4$ main + sh-4.4$ g++ -std=c++98 -o main *.cpp sh-4.4$ main + sh-4.4$ #include <iostream> #include <vector> using namespace std; class ClassA{ public: ClassA(){ cout << "+" << endl; } }; int main() { vector<ClassA> vectorOfObjectsA; vectorOfObjectsA.resize(2); return 0; }
  • 49. Д.З. №2 • Знайти кількість входжень другої літери прізвища в П.І.Б. #include <iostream> #include <string> #include <algorithm> using namespace std; int main() { string str = "00110011123456789"; cout << std::count(str.begin(), str.end(), '1') << endl; return 0; }
  • 50. АМО.L10 (L10.1) from Java API Java's Collections Framework (JCL)
  • 53.
  • 54. Java Collections Framework • Java Collections Framework - набір зв'язаних класів та інтерфейсів, які реалізують commonly reusable collection структури даних. Він був вперше спроектований і розроблений Джошуа Блохом. • JCF був розроблений для досягнення ряду цілей: • Фреймворк повинен бути високопродуктивний. Реалізації фундаментальних колекцій (динамічні масиви, зв'язані списки, дерева та хеш-таблиці) повинні бути високоефективними. • Система повинна дозволяти різним типам колекцій працювати аналогічним чином і з високим ступенем взаємодії. • Фреймворк має легко поширювати та/або адаптувати колекцію.
  • 55. Засоби узагальненого програмування в java • Колекція – це об'єкт, який представляє групу об'єктів. Використання колекцій забезпечує підвищення ефективності програм завдяки використанню високоефективних алгоритмів, а також сприяє створенню коду, придатного для повторного використання. Основними елементами засобів роботи з колекціями є такі: – інтерфейси – стандартні реалізації інтерфейсів – алгоритми – утиліти для роботи з масивами • Засоби Java для роботи з колекціями надають уніфіковану архітектуру для представлення та управління наборами даних. Ця архітектура дозволяє працювати з колекціями незалежно від деталей їх внутрішньої організації. Засоби для роботи з колекціями включають більше десятка інтерфейсів, а також стандартні реалізації цих інтерфейсів і набір алгоритмів для роботи з ними.
  • 56. Архітектура JCL • Майже всі колекції породжуються інтерфейсом java.util.Collection, який визначає основну структуру всіх колекцій. Його методи: add() - додавання елементу до колекції, remove() - видалення елементу з колекції, toArray() - повертає масив елементів, які є в колекції, contains() - перевіряє наявність заданого елементу в колекції та інші. Інтерфейс Collection успадковується від інтерфейсу java.lang.Iterable
  • 57. Інтерфейс Collection Видаляє всі елементи з колекціїvoid clear() Залишає об'єкти, наявні в другій колекціїboolean retainAll(Collection<?> c) Видаляє об'єкти з колекціїboolean removeAll(Collection<?> c) Додає об'єкти в колекцію. Повертає true, якщо об'єкти додані boolean addAll(Collection<? extends E> c) Повертає true якщо колекція містить іншу колекціюboolean containsAll(Collection<?> c) Видаляє об'єкт з колекціїboolean remove(Object o) Додає об'єкт у колекцію. Повертає true, якщо об'єкт доданийboolean add(E e) Повертає масив посилань на T, який містить копії всіх елементів колекції<T> T[] toArray(T[] a) Повертає масив посилань на Object, який містить копії всіх елементів колекціїObject[] toArray() Повертає ітератор – об'єкт, який послідовно вказує на елементиIterator<E> iterator Повертає true, якщо колекція містить об'єктboolean contains(Object o) Повертає true, якщо колекція порожняboolean isEmpty() Повертає розмір колекціїint size() ОписМетод
  • 58. Map • Асоціативні масиви можуть зберігати пари посилань на об'єкти. Асоціативні масиви теж є узагальненими типами. Асоціативні масиви у Java представлені узагальненим інтерфейсом Map, який реалізовано, зокрема, класом HashMap. Інтерфейс SortedMap, похідний від Map, вимагає впорядкованого за ключем зберігання пар. Інтерфейс NavigableMap, що з'явився в java SE 6, розширює SortedМap і додає нові можливості пошуку за ключем. Цей інтерфейс реалізовано класом TreeMap. • На логічному рівні можна представити асоціативний масив через три допоміжних колекції: – keySet - множина значень ключа; – values - список значень; – entrySet - множина пар «ключ-значення».
  • 59. Ітератор • Для проходження по колекції (списку) об'єктів використовується ітератор – спеціальний допоміжний об'єкт. Як і самі контейнери, ітератори базуються на інтерфейсі. Інтерфейс Іterator, визначений у пакеті java.utіl. Будь-який ітератор має три методи: – boolean hasNext(); // перевіряє, чи є ще елементи в контейнері, та повертає true, якщо ще є елементи послідовності. – Object next(); // повертає посилання на наступний елемент – void remove(); // видаляє останній обраний елемент (на який посилається ітератор)
  • 60. Робота зі списками • Інтерфейс List описує упорядковану колекцію (послідовність). Цей інтерфейс реалізують стандартні класи ArrayList і LinkedList. Клас ArrayList реалізує список за допомогою масиву змінної довжини. Клас LinkedList зберігає об'єкти за допомогою так званого зв'язаного списку. • У списках зберігаються посилання на java.lang.Object. Як і в масивах, доступ до елементів може здійснюватися за індексом (але не через операцію []). На відміну від масивів, розмір списків може динамічно змінюватися. Java надає варіанти створення списків як із застосуванням узагальнень, так і без них. Варіант без узагальнень вважається застарілим і небажаним. List<String> s = new ArrayList<String>(); s.add("First"); s.add("Second"); for (Iterator<String> i = s.iterator(); i.hasNext(); ) { System.out.println(i.next()); } //for (int i = 0; i < s.size(); i++) { // System.out.println(al.get(i)); //}
  • 61. Робота з множинами • Множина – це колекція, що не містить однакових елементів. Три основних реалізації інтерфейсу Set - HashSet, LinkedHashSet і TreeSet. Як і списки, множини є узагальненими типами. Класи HashSet і LinkedHashSet використовують хеш-коди для ідентифікації елемента. Клас TreeSet використовує двійкове дерево для збереження елементів і гарантує їх певний порядок. • У наведеному нижче прикладі до множини цілих чисел додається десять випадкових значень у діапазоні від -9 до 9: import java.util.*; public class SetOfIntegers { public static void main(String[] args) { Set<Integer> set = new TreeSet<Integer>(); Random random = new Random(); for (int i = 0; i < 10; i++) { Integer k = random.nextInt() % 10; set.add(k); } System.out.println(set); } }
  • 62. Робота з чергою та стеком • Для реалізації черги найзручніше використовувати клас LinkedList, який реалізує інтерфейс Queue. Наприклад: import java.util.LinkedList; import java.util.Queue; public class SimpleQueueTest { public static void main(String[] args) { Queue<String> queue = new LinkedList<>(); queue.add("First"); queue.add("Second"); queue.add("Third"); queue.add("Fourth"); String s; while ((s = queue.poll()) != null) { System.out.print(s + " "); // First Second Third Fourth } } }
  • 63. Робота з чергою та стеком • У JRE 1.1 стек представлений класом Stack. Наприклад: import java.util.Stack; public class StackTest { public static void main(String[] args) { Stack<String> stack = new Stack<>(); stack.push("First"); stack.push("Second"); stack.push("Third"); stack.push("Fourth"); String s; while (!stack.isEmpty()) { s = stack.pop(); System.out.print(s + " "); // Fourth Third Second First } } }
  • 64. Робота з чергою та стеком • Цей клас в даний час не рекомендований до використання. Замість нього можна використовувати інтерфейс Deque, який оголошує аналогічні методи. Наприклад: import java.util.ArrayDeque; import java.util.Deque; public class AnotherStackTest { public static void main(String[] args) { Deque<String> stack = new ArrayDeque<>(); stack.push("First"); stack.push("Second"); stack.push("Third"); stack.push("Fourth"); String s; while (!stack.isEmpty()) { s = stack.pop(); System.out.print(s + " "); // Fourth Third Second First } } }
  • 65. Алгоритми • Для колекцій існує допоміжний клас Collections. Цей клас надає низку функцій для роботи з колекціями. • Клас Collections містить реалізацію статичних функцій: • sort() (сортування), • fill() (запис всіх значень), • max() (пошук максимального елемента), • min() (пошук мінімального елемента), • indexOfSubList()(пошук індексу першого повного входження підсписку у список), • frequency() (визначення кількості разів входження певного елемента у список), • reverse() (заміна порядку елементів на протилежний), • rotate() (циклічний зсув списку на задану кількість елементів), • shuffle() ("тасування" елементів), • nCopies() (створення нового списку з визначеною кількістю однакових елементів).
  • 67. java.util.concurrent • В мові Java потік представляється в вигляді обєкту-потомка класу Thread. Цей клас інкапсулює стандартні механізми роботи з потоком. Потоками можна управляти або напряму, або засобами абстрактних механізмів, таких як Executor і колекції з пакету java.util.concurrent. • Запустити новий потік можна двома способами: – Реалізацією інтерфейсу Runnable public class HelloRunnable implements Runnable { public void run() { System.out.println("Привіт з потоку!"); } public static void main(String[] args) { (new Thread(new HelloRunnable())).start(); } } – Наслідуванням від класу Thread public class HelloThread extends Thread { public void run() { System.out.println("Привіт з потоку!"); } public static void main(String[] args) { (new HelloThread()).start(); } }
  • 68. from Framework Class Library (FCL) • using System.Collections.Generic • using System.Collections // застаріла • using System.Collections.Concurrent АМО.L10 (L10.2)
  • 69. .NET
  • 70. Колекції • Головна перевага колекцій полягає в тому, що вони стандартизують обробку груп об'єктів у програмі. Всі колекції розроблені на основі набору чітко визначених інтерфейсів. Деякі вбудовані реалізації таких інтерфейсів, в тому числі ArrayList, Hashtable, Stack та Queue, можуть застосовуватися в початковому вигляді і без будь-яких змін. Є також можливість реалізувати власну колекцію, хоча потреба в цьому виникає вкрай рідко. • У середовищі .NET Framework підтримуються п'ять типів колекцій: • неузагальнені, • спеціальні, • для порозрядних операцій, • узагальнені, • паралельні.
  • 71. Неузагальнені колекції • Реалізують ряд основних структур даних, включаючи динамічний масив, стек, чергу, а також словники, в яких можна зберігати пари "ключ-значення". Відносно неузагальнених колекцій важливо мати на увазі наступне: вони оперують даними типу object. Таким чином, неузагальнені колекції можуть служити для зберігання даних будь-якого типу, причому в одній колекції допускається наявність різнотипних даних. Очевидно, що такі колекції не типізовані, оскільки в них зберігаються посилання на дані типу object. Класи та інтерфейси неузагальнених колекцій знаходяться в просторі імен System.Collections
  • 72. Спеціальні колекції • Оперують даними спецефічного типу або ж роблять це якимось особливим чином. Наприклад, є спеціальні колекції для символьних рядків, а також спеціальні колекції, в яких використовується односпрямований список. Спеціальні колекції оголошуються в просторі імен System.Collections.Specialized
  • 73. Поразрядна колекція • У прикладному інтерфейсі Collections API визначена одна колекція з порозрядною організацією – це BitArray. Колекція типу BitArray підтримує порозрядні операції, тобто операції над окремими двійковими розрядами, наприклад І, АБО, виключне АБО, а отже, вона істотно відрізняється своїми можливостями від інших типів колекцій. Колекція типу BitArray оголошується в просторі імен System.Collections
  • 74. Узагальнені колекції • Забезпечують узагальнену реалізацію декількох стандартних структур даних, включаючи зв'язані списки, стеки, черги і словники. Такі колекції є типізованими в силу їх узагальненого характеру. Це означає, що в узагальненій колекції можуть зберігатися тільки такі елементи даних, які сумісні за типом з даною колекцією. Завдяки цьому виключається випадкова розбіжність типів. Узагальнені колекції оголошуються в просторі імен System.Collections.Generic
  • 75. Паралельні колекції • Підтримують багатопоточний доступ до колекції. • Ці узагальнені колекції, визначені в просторі імен System.Collections.Concurrent
  • 76. Нумератор(перелічувач) • Дуже важливим для всіх колекцій є поняття перелічувача, який підтримується в неузагальнених інтерфейсах IEnumerator і IEnumerable, а також в узагальнених інтерфейсах IEnumerator<T> і IEnumerable<T>. Нумератор забезпечує стандартний спосіб почергового доступу до елементів колекції. Отже, він перераховує вміст колекції. У кожній колекції повинна бути реалізована узагальнена або неузагальнених форма інтерфейсу IEnumerable, тому елементи будь- якого класу колекції повинні бути доступні за допомогою методів, визначених в інтерфейсі IEnumerator або IEnumerator<T>. Це означає, що, внісши мінімальні зміни в код циклічного звернення до колекції одного типу, його можна використовувати для аналогічного звернення до колекції іншого типу.Цікаво, що для почергового звернення до вмісту колекції в циклі foreach використовується також нумератор. • З перелічувачем безпосередньо пов'язаний і ітератор. Цей засіб спрощує процес створення класів колекцій, наприклад спеціальних, почергове звернення до яких організовується в циклі foreach.
  • 77. Інтерфейси Інтерфейс IProducerConsumerCollection <T> був доданий у версію .NET 4 для підтримки нових, безпечних щодо потоків класів колекцій. IProducerConsumerCollection <T> Інтерфейс IEqualityComparer <T> реалізований компаратором, який може бути застосований до ключів словника. Через цей інтерфейс об'єкти можуть бути перевірені на предмет еквівалентності один одному. В .NET 4 цей інтерфейс також реалізований масивами і кортежами. IEqualityComparer <T> Інтерфейс IComparer <T> реалізований компаратором і використовується для сортування елементів усередині колекції за допомогою методу Compare (). IComparer <T> Подібно IDictionary <TKey, TValue> підтримує ключі і значення. Однак у цьому випадку колекція може містити множинні значення для одного ключа. ILookup <TKey, TValue> Інтерфейс IDictionary <TKey, TValue> реалізується узагальненими класами колекцій, елементи яких складаються з ключа і значення. За допомогою цього інтерфейсу можна отримувати доступ до всіх ключам і значенням, витягувати елементи по індексатора типу ключа, а також додавати і видаляти елементи. IDictionary<TKey, TValue> Інтерфейс ISet <T> з'явився у версії .NET 4. Цей інтерфейс реалізується множинами. Він дозволяє комбінувати різні множини в об'єднання, а також перевіряти, чи не перетинаються дві множини. ISet <T> успадкований від ICollection <T>. ISet<T> Інтерфейс IList <T> призначений для створення списків, елементи яких доступні по своїх позиціях.Цей інтерфейс визначає індексатор, а також способи вставки і видалення елементів в певні позиції (методи Insert () і Remove ()). IList <T> успадкований від ICollection <T>. IList<T> ICollection <T> – це інтерфейс, реалізований класами узагальнених колекцій. З його допомогою можна отримати кількість елементів в колекції (властивість Count) і скопіювати колекцію в масив (метод СоруТо ()). Можна також додавати і видаляти елементи з колекції (Add (), Remove (), Clear ()). ICollection<T> Інтерфейс IEnumerable необхідний, коли з колекцією використовується оператор foreach. Цей інтерфейс визначає метод GetEnumerator (), який повертає Нумератор, який реалізує IEnumerator. IEnumerable<T> ОписІнтерфейс Інтерфейси, що використовуються в колекціях C#
  • 78. System.Collections.ObjectModel • У просторі імен System.Collections.ObjectModel знаходиться також ряд класів, що підтримують створення користувачами власних узагальнених колекцій