Контейнери STL: MultiMap. Частина 8




клас MultiMap C ++, STL контейнери, multimap для початківцівМи розглянули простий приклад використання map<> для підрахунку входження окремих літер в текст. Для цієї мети ми використовували контейнер карта<>. Але бібліотека STL нам надає і інший (близький) тип контейнера - це MultiMap<>, який допускає наявність багатьох элементов (пара<>) в своєму складі з однаковими значеннями ключів.

природно, що основні правила функціонування MultiMap<> зміняться (порівняно з карта<>). Для такого контейнера будуть наступні відмінності в поведінці:

  • Містить впорядковані пари <ключ,значение>, де ключ і значення можуть належати до довільних типів;

  • Елементи з будь-якими значеннями ключа не повинні бути унікальнімені, в впорядкованої послідовності елементів (по ключу) такі еквівалентні елементи представлені, як різні елементи, і розташовуються вони один за одним;

  • Оскільки ключі можуть збігатися, то операція додавання нової пари в таблицю (метод вставити()) завжди успішний. Тому немає сенсу повертати результат такої операції: повертається значення - void;

  • Оскільки тепер у контейнері може перебувати багато елементів з рівними ключами, то вводиться додатковий метод count(). Він отримує параметром значення ключа, повертає число входжень елементів, мають такий ключ, в контейнер;

  • операції видалення (метод прати()) із зазначенням ключа видаляється елемента видаляє все відразу елементи з однаковими ключами;

подивимося як MultiMap<> впорається з попередньої завданням. Ось текстові файли для тестування програми:

30 Брат і сестра 11 Дурниця 34 Бармаглот

Як і в попередньому прикладі, використовується кілька громіздкий введення символів з потоку, що містить текст у багато рядків. Это связано с тем, що а). хотілося б читати і символи пробілу теж як символи, а не як роздільники і б). можна було б просто послідовно читати символи з cin з наступним виключенням переказів рядка. Але в показаному варіанті хотілося б зберегти незалежність від операційної системи (відмінність так званого DOS і UNIX перекладу рядка). В іншій частині код став багато коротше і простіше.

результат того, що ми отримали, показаний нижче (поруч повторено для порівняння той же дію, виконується карта<>):

клас MultiMap C ++, STL контейнери, multimap для початківців
MultiMap
клас Карта C ++, STL контейнери, map для початківців
карта

Звернемо увагу на те, як одиничним оператором видалення alphabet.erase( 'а’ ) ми видалили з таблиць 38 элементов, визначаються ключем 'а’. Звідки взявся розмір size() в 696 элементов?




клас MultiMap C ++, STL контейнери, multimap для початківців

(Показана форма команди wc обчислює в операційній системі Linux число рядків у файлі. Команда ls виводить довжину файлу, т.е. число окремих байт, символів в файлі. У Windows ви можете спробувати домогтися деякого подібного результату використовуючи команду dir.)

Якщо ми із загального числа символів (довжини в байтах) віднімемо число рядків (перекладів рядків) у файлі, то ми і отримаємо цю цифру: 726 – 30 = 696. Таким образом, для кожного символу вхідного потоку був створений окремий елемент таблиці, например, з ключем 's’ було 39 таких елементів.

Усе, раніше сказане щодо карта контейнера<> (крім алгоритму приміщення і вибірки) в повній мірі відноситься і до MultiMap<>, например, вимога порівнянності ключів і то, як визначити чи перевизначити операцію порівняння.

Нові уроки з програмування:

Контейнери STL: MultiMap. Частина 8
Оціни цю статтю

Про Olej

Стаж практичних програмних розробок близько 40 лет. Викладач міжнародної софтверної компанії Global Logic. Постійний автор публікацій IBM Developer Works. Науковий редактор книжкового видавництва комп'ютерної літератури "Символ-Плюс", Санкт-Петербург.

залишити коментар

Ваша електронна адреса не буде опублікований. Обов'язкові поля позначені * *