Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Controlling collection types

Boost , Chapter 1. Boost.Bimap , The tutorial

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Как уже было сказано, на картах STL можно контролировать только ограничения одной из коллекций, а именно той, которую вы просматриваете. В Росте. Бимап, вы можете контролировать оба, и это так же просто, как использовать STL.

extended.mapping.framework

Идея состоит в том, чтобы использовать те же имена ограничений, которые используются в стандарте. Если вы не указали тип сбора, увеличить. Бимап предполагает, что коллекция представляет собой набор. Инсталляция бимапа с пользовательскими типами коллекций выглядит следующим образом:

typedef bimap< CollectionType_of<A>, CollectionType_of<B> > bm_type;

Ниже приведен список всех поддерживаемых типов коллекций.

Table 1.2. Collection of Key Types

имя

Особенности

Тип карты

<set_of>

Упорядоченный, уникальный

<map>

<multiset_of>

приказал

<multimap>

<unordered_set_of>

хешированный, уникальный

<unordered_map>

<unordered_multiset_of>

Хашед

<unordered_multimap>

<list_of>

секвенированный

<list_map>

<vector_of>

случайный доступ

<vector_map>

<unconstrained_set_of>

без ограничений

нельзя смотреть


<list_of>и<vector_of>карты не связаны с существующими ассоциативными контейнерами STL. Это два примера несортированных ассоциативных контейнеров.<unconstrained_set_of>Позволяет пользователю игнорировать вид. Это будет объяснено позже.

bimap.structures

Выбор типа коллекции влияет на возможные операции, которые вы можете выполнять с каждой стороны карты, и время, необходимое для выполнения каждой из них. Если у нас есть:

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, который сравнивает два типа. Все эти параметры точно такие же, как у стандартного библиотечного контейнера, за исключением типа распределителя. Позже вы узнаете, как изменить распределитель для бимапа.

В следующей таблице перечислены значения параметров каждого типа коллекции.

имя

Дополнительные параметры

<set_of<T,KeyComp>>

<multiset_of<T,KeyComp>>

KeyComp— это функтор, который сравнивает два типа, используя меньше, чем оператор. По умолчанию это<std::less<T>>

.

<unordered_set_of<T,HashFunctor,EqualKey>>

<unordered_multiset_of<T,HashFunctor,EqualKey>>

HashFunctorпреобразует<T>объект в<std::size_t>значение. По умолчанию это<boost::hash<T>>.

Равный ключявляется Функтором, который проверяет два типа равенства. По умолчанию оператор равенства<std::equal_to<T>>

.

<list_of<T>>

Никаких дополнительных параметров.

<vector_of<T>>

Никаких дополнительных параметров.

<unconstrained_set_of<T>>

Никаких дополнительных параметров.

Countries Populations

Мы хотим сохранить население стран. Требования следующие:

  1. Получите список стран в порядке убывания их населения.
  2. Если у вас есть страна, получите ее население.

Давайте создадим соответствующую карту.

typedef bimap<
    unordered_set_of< std::string >,
    multiset_of< long, std::greater<long> >
> populations_bimap;

Названия стран являются уникальными идентификаторами, в то время как две страны могут иметь одинаковую численность населения. Вот почему мы выбираеммульти<set_of>для популяций.

Использование<multiset_of>для населения позволяет нам повторять данные. Поскольку перечисление стран, заказанных по их названиям, не является обязательным, мы можем использовать<unordered_set_of>, который позволяет постоянно искать заказы.

И теперь давайте использовать его в полном примере.

Go to source code

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 requirement
1for( 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
2std::cout << "Population of China: " << pop.left.at("China") << std::endl;

1

Правильный вид карты работает как<std::multimap<long,std::string,std::greater<long>>>, Мы можем повторить его, чтобы напечатать результаты в необходимом порядке.

2

Левый вид карты работает как<std::unordered_map<std::string,long>>, учитывая название страны, которую мы можем использовать для поиска населения в постоянное время.

Repetitions counter

Мы хотим подсчитать повторы для каждого слова в тексте и распечатать их в порядке появления.

Go to source code

typedef bimap
<
    unordered_set_of< std::string >,
    list_of< counter > 1
> 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 )
{
    2++ wc.left[*it];
}
// list words with counters by order of appearance
3for( word_counter::right_const_iterator
        wit = wc.right.begin(), wit_end = wc.right.end();
     wit != wit_end; ++wit )
{
    std::cout << wit->second << ": " << wit->first;
}

1

<counter>— целое число, инициализированное в нуле в конструкторе.

2

Поскольку правильный тип сбора<list_of>, правильные данные не используются в качестве ключа и могут быть изменены таким же образом, как и в стандартных картах.

3

Когда мы вставляем элементы, используя вид с левой карты, элемент вставляется в конце списка.


PrevUpHomeNext

Статья Controlling collection types раздела Chapter 1. Boost.Bimap The tutorial может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: The tutorial ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 18:33:01/0.008159875869751/0