С++ для начинающих


Контейнеры multimap и multiset


Контейнеры map и set не допускают повторяющихся значений ключей, а multimap (мультиотображение) и multiset (мультимножество) позволяют сохранять ключи с дублирующимися значениями. Например, в телефонном справочнике может понадобиться отдельный список номеров для каждого абонента. В перечне книг одного автора может быть несколько названий, а в нашей программе с одним словом текста сопоставляется несколько позиций. Для использования multimap и multiset нужно включить соответствующий заголовочный файл – map или set:

#include <map>

multimap< key_type, value_type > multimapName;

// ключ - string, значение - list< string >

multimap< string, list< string > > synonyms;

#include <set>

multiset< type > multisetName;

Для прохода по мультиотображению или мультимножеству можно воспользоваться комбинацией итератора, который возвращает find() (он указывает на первый найденный элемент), и значения, которое возвращает count(). (Это работает, поскольку в данных контейнерах элементы с одинаковыми ключами обязательно являются соседними). Например:

#include <map>

#include <string>

void code_fragment()

{

    multimap< string, string > authors;

    string search_item(  "Alain de Botton" );

    // ...

    int number = authors.count( search_item );

    mu1timap< string,string >::iterator iter;

    iter = authors.find( search_item );

    for ( int cnt = 0; cnt < number; ++cnt, ++-iter )

        do_something( *iter );

    // ...



}

Более элегантный способ перебрать все значения с одинаковыми ключами использует специальную функцию-член equal_range(), которая возвращает пару итераторов. Один из них указывает на первое найденное значение, а второй – на следующее за последним найденным. Если последний из найденных элементов является последним в контейнере, второй итератор содержит величину, равную end():

#include <map>

#include <string>

#include <utility>



Содержание раздела