![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Controlling collection typesBoost , Chapter 1. Boost.Bimap , The tutorial
|
имя |
Особенности |
Тип карты |
---|---|---|
< | Упорядоченный, уникальный | < |
< | приказал | < |
< | хешированный, уникальный | < |
< | Хашед | < |
< | секвенированный | < |
< | случайный доступ | < |
< | без ограничений | нельзя смотреть |
<list_of
>и<vector_of
>карты не связаны с существующими ассоциативными контейнерами STL. Это два примера несортированных ассоциативных контейнеров.<unconstrained_set_of
>Позволяет пользователю игнорировать вид. Это будет объяснено позже.
Выбор типа коллекции влияет на возможные операции, которые вы можете выполнять с каждой стороны карты, и время, необходимое для выполнения каждой из них. Если у нас есть:
typedef bimap< CollectionType_of<A>, CollectionType_of<B> > bm_type; bm_type bm;
Ниже описывается полученный вид карты двунаправленной карты.
bm.left
>совместим сLeftMapType<<A,B>
>bm.right
>совместим сПравильный тип<<B,A>
>Каждый шаблон типа коллекции имеет различные параметры для управления своим поведением. Например, в спецификации<set_of
>можно пройти тип Functor, который сравнивает два типа. Все эти параметры точно такие же, как у стандартного библиотечного контейнера, за исключением типа распределителя. Позже вы узнаете, как изменить распределитель для бимапа.
В следующей таблице перечислены значения параметров каждого типа коллекции.
имя |
Дополнительные параметры |
---|---|
< < | KeyComp— это функтор, который сравнивает два типа, используя меньше, чем оператор. По умолчанию это< |
< < | HashFunctorпреобразует< Равный ключявляется Функтором, который проверяет два типа равенства. По умолчанию оператор равенства< |
< | Никаких дополнительных параметров. |
< | Никаких дополнительных параметров. |
< | Никаких дополнительных параметров. |
Мы хотим сохранить население стран. Требования следующие:
Давайте создадим соответствующую карту.
typedef bimap< unordered_set_of< std::string >, multiset_of< long, std::greater<long> > > populations_bimap;
Названия стран являются уникальными идентификаторами, в то время как две страны могут иметь одинаковую численность населения. Вот почему мы выбираеммульти<set_of
>для популяций.
Использование<multiset_of
>для населения позволяет нам повторять данные. Поскольку перечисление стран, заказанных по их названиям, не является обязательным, мы можем использовать<unordered_set_of
>, который позволяет постоянно искать заказы.
И теперь давайте использовать его в полном примере.
typedef bimap< unordered_set_of< std::string >, multiset_of< long, std::greater<long> > > population_bimap; typedef population_bimap::value_type population; population_bimap pop; pop.insert( population("China", 1321000000) ); pop.insert( population("India", 1129000000) ); pop.insert( population("United States", 301950000) ); pop.insert( population("Indonesia", 234950000) ); pop.insert( population("Brazil", 186500000) ); pop.insert( population("Pakistan", 163630000) ); std::cout << "Countries by their population:" << std::endl; // First requirementfor( population_bimap::right_const_iterator i = pop.right.begin(), iend = pop.right.end(); i != iend ; ++i ) { std::cout << i->second << " with " << i->first << std::endl; } // Second requirement
std::cout << "Population of China: " << pop.left.at("China") << std::endl;
Правильный вид карты работает как< | |
Левый вид карты работает как< |
Мы хотим подсчитать повторы для каждого слова в тексте и распечатать их в порядке появления.
typedef bimap < unordered_set_of< std::string >, list_of< counter >> word_counter; typedef boost::tokenizer<boost::char_separator<char> > text_tokenizer; std::string text= "Relations between data in the STL are represented with maps." "A map is a directed relation, by using it you are representing " "a mapping. In this directed relation, the first type is related to " "the second type but it is not true that the inverse relationship " "holds. This is useful in a lot of situations, but there are some " "relationships that are bidirectional by nature."; // feed the text into the container word_counter wc; text_tokenizer tok(text,boost::char_separator<char>(" \t\n.,;:!?'\"-")); for( text_tokenizer::const_iterator it = tok.begin(), it_end = tok.end(); it != it_end ; ++it ) {
++ wc.left[*it]; } // list words with counters by order of appearance
for( word_counter::right_const_iterator wit = wc.right.begin(), wit_end = wc.right.end(); wit != wit_end; ++wit ) { std::cout << wit->second << ": " << wit->first; }
< | |
Поскольку правильный тип сбора< | |
Когда мы вставляем элементы, используя вид с левой карты, элемент вставляется в конце списка. |
Статья Controlling collection types раздела Chapter 1. Boost.Bimap The tutorial может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: The tutorial ::
реклама |