Les_28_asociat.ppt
- Количество слайдов: 15
Асоціативні контейнери
• Відображення (асоціативний масив) map та мультивідображення multimap • Множина set та мультимножина multiset - Забезпечують швидкий доступ до своїх елементів - При додаванні нових елементів неможливо знати їх конкретне місцезнаходження в контейнері - Елементи в асоціативному контейнері відсортовані за ключем.
map • Заголовковий файл <map> • послідовність пар (ключ-значення) • забезпечує швидкий пошук значення за ключем. • Ключі є унікальними. Для типу ключа повинна існувати операція «менше» .
pair value_type для map це pair<const Key, mapped_type> template<class T 1, class T 2> struct pair { typedef T 1 first_type; typedef T 2 second_type; T 1 first; T 2 second; pair(); pair(const T 1& x, const T 2& y) : first(x), second(y) {} // Templatized copy-constructor: template<class U, class V> pair(const pair<U, V> &p); };
При створенні pair конструктором за замовчуванням поля ініціалізуються значеннями за замовчуванням для вбудованих типів і конструкторами за замовчування для типів, створених користувачем: pair<int, string> p 1; p 1. first=1; p 2. second=“yyy”; Крім конструкторів пара може бути створена функцією: pair<T 1, T 2> make_pair (const T 1& t 1, const T 2& t 2);
Конструктори асоціативних контейнерів • Assoc() – конструктор за замовчуванням • Assoc(cmp) – використовує об”єкт-функцію cmp для порівняння • Assoc(b_it, e_it) – ініціалізація інтервалом [b_it, e_it) • Assoc(b_it, e_it, cmp) – ініціалізація інтервалом [b_it, e_it) з використанням cmp для порівняння
оператор [ ] • Типова операція з map – це асоціативний пошук з допомогою оператора [ ]: mapped_type & operator[ ](const key_type & k) • Якщо ключ не знайдено, в map додається новий елемент з цим ключем і значенням за замовчуванням типу mapped_type. map<string, int> m; int x=m[“C++”]; // x=0 m[“C#”]=5; int y=m[“C++”]; // y=0 m[“C#”]=3;
// Підрахунок однакових слів в файлі int main() { ifstream in(“text 1. txt”); map<string, int> wordmap; string word; while(in >> word) wordmap[word]++; map<string, int> iterator w; for(w = wordmap. begin(); w != wordmap. end(); w++) cout << w->first << ": " << w->second << endl; }
Методи map • find(k) - повертає ітератор, що відповідає ключу k, якщо нема такого елемента – повертає end() (для multimap вказутиме на перший елемент з таким ключем) • count(k) – підраховує кількість елментів з ключем k • lower_bound(k) – повертає ітератор на початок послідовності елементів контейнера з ключем k. • upper_bound(k) – повертає ітератор на елемент з ключем більшим ніж k • equal_range(k) - Повертає пару ітераторів на таку підпослідовність
• insert(p) - намагається вставити в конт. пару p (якщо в map нема значення з ключем p. first). Повертає pair<iterator, bool>. Ітератор вказує на елемент, що має ключ p. first, true, якщо p вставлено. • insert(w_it, p) - w_it – звідки почати пошук ключа p. first • insert(b_it, e_it) – вставка послідовновності [b_it, e_it) • erase(k) - видалення за ключем, повертає кількість видалених ел. • size() • max_size() • empty() • void swap(map&) Визначено оператори ==, !=, <, >, <=, >= і функцію swap(), як глобальні функції.
multimap • в контейнер можуть входити пари з однаковими ключами • Методи такі ж як і в map, відмінності: - немає оператора індексації[ ] - iterator insert(const value_type&) - повертає ітератор, а не пару. multimap<string, int> m; m. insert(make_pair(“c”, 4)); m. insert(make_pair(“c”, 5)); • Методи equel_range(), lower_bond() і upper_bond() – основні засоби доступу до декількох значень з одним ключем.
//Телефонна книга записана в контейнер мultimap. // видрукувати всі телефони Петренка multimap<string, int> phone_book; typedef multimap<string, int>: : iterator I; pair<I, I> b=phone_book. equal_range(“Petrenko”); for(I i=b. first; i!=b. second; i++) cout<<(*i). second<<’n’;
Множина set • Ключ співпадає зі значенням: typedef Key value_type • Елементи унікальні (без повторів). • Методи такі ж як і в map • Немає оператора доступу за індексом[ ]
Мультимножина multiset • множина, що допускаї однакові ключі
int fun() { const char* fname = "Multi. Set. Word. Count. cpp"; ifstream in(fname); multiset<string> wordmset; string word; while(in >> word) wordmset. insert(word); typedef multiset<string>: : iterator MSit; MSit it = wordmset. begin(); while(it != wordmset. end()) { pair<MSit, MSit> p = wordmset. equal_range(*it); int count = distance(p. first, p. second); cout << *it << ": " << count << endl; it = p. second; // Move to the next word } }
Les_28_asociat.ppt