Контейнери STL: карта. Частина 7




клас Карта C ++, STL контейнери, map для початківцівМи роздивились простий приклад використання map<>, але використання такого контейнера вже істотно складніше послідовних контейнерів. контейнер карта<> (таблиця, відображення):

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

  • Елементи з будь-яким значенням ключа повинні бути унікальні;

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

  • Операція додавання нової пари в таблицю повертає пару типу <итератор, bool>, у якій другий компонент (логічний second) вказує на успішність операції. Якщо він true, то перший компонент повертається результату (first) дає итератор доданого елемента. Якщо ж він false, то повертається итератор існуючого елемента з тим же ключем;

  • Операції індексації таблиці ( [ ] или at() ) вимагають в якості ключа будь-яке значення типу, певного для ключа;

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

  • навпаки, операція індексації [ ], при завданні ключа-параметра, відсутнього в складі елементів таблиці, виняток не викликає. (навпаки, навіть якщо індексація запрошені тільки з читання, додає к контейнеру новый элемент с требуемым значением ключа, але з нульовим полем значення);

Ці визначення можуть здатися мудрими, але все роз'яснить наступний приклад.

Перш уявлення прикладу, ми повинні підготувати деякі файли тестових даних для роботи з асоціативними контейнерами. Робота саме з об'ємними символьними даними демонструє всю міць використання таблиць STL. Як текстових даних ми підготуємо файли, містять англомовні оригінальні тексти кількох віршів Льюїса Керола.

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

Вам надано кілька текстів різної довжини для ґрунтовного тестування кодів цієї і наступних частин викладу (файли показані з підрахунком числа рядків їхніх текстів). Здесь, например, Humpty-Dumpty.txt - це текст з частини VI Humpty-Dumpty «Аліса в задзеркаллі».

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

А Jabberwock.txt - це текст з частини VI Humpty-Dumpty «Аліса в задзеркаллі» - відоме в російськомовному варіанті вірш (у виконанні В. С. Висоцького): Про бійся Бармаглота, син! Він так Свірп і дик…

У нашому оригіналі (авторське, англомовному, для налагодження – Jabberwock.txt файл) цей текст виглядає так:

Бармаглот Twas brillig, і Холявко шорькі
Штрикав для наведення:
Все mimsy були Borogove,
Як мюмзики в мове.

«Стережіться Jabberwock, мій син!
Щелепи, які кусаються, клешні, які ловлять!
Остерігайтеся птиці Jubjub, і цуратися
Злопастний Брандашмиг!» …

текст, безумовно, синтаксично складний, що робить його прекрасним матеріалом для налагодження додатків. Вам надається відмінний матеріал для подальших самостійних експериментів!

Отже ... наш додаток буде підраховувати число входжень кожної з літер алфавіту в пропонований текст, используя карта<>:

контейнер карта<> - Не найкращий варіант для поставлених цілей: при знаходженні нової літери в тексті ми спробуємо додати її в якості ключа таблиці, але якщо ця літера вже присутній в таблиці, то спроба завершиться невдачею. В этом случае, після невдачі, ми, за індексом ключа, просто інкрементіруем число його входжень. І ось що ми повчає:

клас Карта C ++, STL контейнери, map для початківців
Brother_And_Sister.txt
клас Карта C ++, STL контейнери, map для початківців
Шалтай-Dumpty.txt
клас Карта C ++, STL контейнери, map для початківців
Jabberwock.txt

Зверніть увагу як збільшився розмір таблиці після того, як в ній був індексуванням [ ] здійснений пошук (з читання!) відсутніх ключів ('Д', 'Z', 'Х').

Виникає питання: чому ви бачимо як size() такі значення як 44, 47, 50, 52, якщо ми спостерігаємо тільки розкладку по повторюваності 26 символів від 'a’ до 'Z'? відповідь проста: тому що в текст можуть входити символи пробілу, знаків пунктуації, заголовних літер, яких ми не спостерігаємо у видачі тесту.

Якщо скористатися такою новою можливістю стандарту C ++ 11, як списки ініціалізації, створення і ініціалізація таблиці може виглядати набагато простіше:

природно, все це стане компілюватиметься тільки при вказівці опцій компілятора для використання стандарту C ++ 11:клас Карта C ++, STL контейнери, map для початківців

Зі сказаного вже має бути зрозуміло, що в якості ключа пошуку в таблиці може використовуватися будь-який тип, при обов'язковій умові, що для нього або визначена природна операція порівняння (int, float, string, ...), або ми самі визначимо таку призначену для користувача функцію, яка буде використовуватися для порівнянь. Кілька способів зробити це показані нижче:

тут ми, змінивши функцію порівняння ключів, змінили порядок сортування елементів при розміщенні їх в таблиці. (У 2-му варіанті використовується функціональний об'єкт, функтор, роботі з якими буде присвячена окрема частина нашого розгляду.)

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

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


Згоден отримувати повідомлення від purecodecpp.com на мій e-mail

дата
сторінка
Контейнери STL: карта. Частина 7
рейтинг
5
Olej

Про Olej

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

8 думки про "Контейнери STL: карта. Частина 7

  1. Получилась интересная и понятная статья.
    А будет продолжениеудаление, замена, contains, поиск по ключу и др.?

  2. Спасибо за невероятный труд и помощь в изучении С++, однако теперь пошли непонятки. До сих пор нормально было в течении уроков. Прежде чем что-то писать в качестве примера, нужно объяснить что это. Иначе, если пример непонятен, то толка нет от учебы, только практика запоминается и усваивается. Ладно неупомянутый символ ^Z (ctrl-Z) удается заметить на картинке результата работы программы со стихами в консоли и хорошо, если читатель знает, что он означает конец файла для консоли, без его ввода программа не работала бы (цикл не завершился бы). Но в следующем примере пошло еще тяжелее .

    1) функторы не изучались, что это неизвестно и пример понять невозможно, потому что там написано bool operator(), а мы так не делали ни разу, после слова operator перед скобками всегда писали знак оператора (+, -, …). Хорошо, можно подумать, что наверное подразумевается тот знак, который находится в выражении после return. А в следующих строчках еще более непонятно:

    2) карта< int, int, менше > – это что? Было изучено что map состоит из пары ключ-значение, а less что здесь делает и что такое less вообще непонятно. По виду можно предположить что это некий шаблонный класс с параметром int. Но скорее всего он указывает порядок сортировки по значению ключа в убывании или возрастании данных в контейнере map.

    3) map mg1(великий); – это непонятно. Можно догадываться в том или ином направлении, только догадки мало помогают в таких делах. mg1(великий) – это конструктор с параметром функцией? Такой конструктор для map не изучался, и не только для map.

    4) карта – примерно то же самое.

    Подводя итог можно сказать, что это за третий параметр появился при объявлении объекта-контейнера map внутри угловых скобок? Видно по контексту, что он задает порядок сортировки по значению ключа, но достоверной информации нет.

      1. До сих пор нормально было в течении уроков. Прежде чем что-то писать в качестве примера, нужно объяснить что это.

        1. просто “до сих порбыло только потому, что до сих пор было только цветочкизатрагивались только самые-самые элементарные понятия C++. Сейчас описываются уже достаточно продвинутые средства.

        2. Из матлингвистики, теории языков программирования известно, що будь-який язык программирования не может быть описан строго последовательно, и поэтому описываются они рекурсивно: используя конструкции, которые ещё не описывались ранее. Это теория.
        Если что-то вам категорически не понятнопропустите это, вы вернётесь к нему позже, при “2-м проходе”, когда оно уже станет понятным.

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

Код розміщуйте в тегах: <pre class="lang:C ++ декодуванням:true ">ВАШ КОД</заздалегідь>