Контейнеры STL: Multimap. Teil 8




класс multimap c++, контейнеры STL, multimap для начинающихМы рассмотрели простой пример использования map<> для подсчёта вхождения отдельных литер в текст. Для этой цели мы использовали контейнер Karte<>. Но библиотека STL нам предоставляет и другой (близкий) тип контейнера — это Multimap<>, который допускает наличие многих Element (Paar<>) в своём составе с одинаковыми значениями ключей.

natürlich, что основные правила функционирования Multimap<> изменятся (по сравнению с Karte<>). Для такого контейнера будут следующие отличия в поведении:

  • Es enthält geordnete Paare <Schlüssel,Bedeutung>, wo der Schlüssel und der Wert kann auf beliebige Arten gehören;

  • Элементы с любыми значениями ключа не должны быть einzigartigми, в упорядоченной последовательности элементов (von Schlüssel) такие эквивалентные элементы представлены, wie разные элементы, и располагаются они друг за другом;

  • Поскольку ключи могут совпадать, то операция добавления новой пары в таблицу (Verfahren einfügen()) immer успешна. Поэтому нет смысла возвращать результат такой операции: возвращаемое значение — Leere;

  • Поскольку теперь в контейнере может находиться много элементов с равными ключами, то вводится дополнительный метод Graf(). Он получает параметром значение ключа, возвращает число вхождений элементов, имеющих такой ключ, в контейнер;

  • Операции удаления (Verfahren löschen()) с указанием ключа удаляемого элемента удаляет все сразу элементы с совпадающими ключами;

Посмотрим как Multimap<> справится с предыдущей задачей. Вот текстовые файлы для тестирования программы:

30 Bruder und Schwester 11 Humpty Dumpty 34 Jabberwock

Как и в предыдущем примере, используется несколько громоздкий ввод символов из потока, содержащего текст во много строк. Dies ist, dass und). хотелось бы читать и символы пробела тоже как символы, а не как разделители и b). можно было бы просто последовательно читать символы из Gin с последующим исключением переводов строки. Но в показанном варианте хотелось бы сохранить независимость от используемой операционной системы (различие так называемого DOS и UNIX перевода строки). В остальной части код стал много короче и проще.

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

класс multimap c++, контейнеры STL, multimap для начинающих
Multimap
класс Karte c ++, контейнеры STL, Karte für Anfänger
Karte

Обратим внимание на то, как единичным оператором удаления alphabet.erase( 'ein’ ) мы удалили из таблиц 38 Element, определяющихся ключом 'ein’. Откуда взялся размер Größe() in 696 Element?




класс multimap c++, контейнеры STL, multimap для начинающих

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

Если мы из общего числа символов (длины в байтах) вычтем число строк (переводов строк) в файле, то мы и получим эту цифру: 726 – 30 = 696. Auf diese Weise, для каждого символа входного потока был создан отдельный элемент таблицы, beispielsweise, с ключом ‘s было 39 таких элементов.

Всё, ранее сказанное относительно контейнера map<> (кроме алгоритма помещения и выборки) в полной мере относится и к Multimap<>, beispielsweise, требование сравнимости ключей и то, как определить или переопределить операцию сравнения.

Newsletter neue Lektionen über die Programmierung:

Datum
Seite
Контейнеры STL: Multimap. Teil 8
Wertung
51Star1Star1Star1Star1Star
Öl

Etwa Öl

praktische Erfahrungen über die Softwareentwicklung 40 Jahre. Lehrer Globale Logik internationales Softwareunternehmen. IBM Developer Works Permanent Autor von Publikationen. Wissenschaftliche Herausgeber der Computerliteratur-Verlag "Symbol-Plus", Sankt Petersburg.

Hinterlasse eine Antwort

Platz Code in Tags: <pre class="lang:c ++ dekodieren:true ">DEIN CODE</Vor>