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

Discovering the bimap framework

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 представлены картами. Стандартная карта представляет собой направленное отношение ключей из левой коллекции и данных из правой неограниченной коллекции. На следующей диаграмме показаны представленные отношения и точка зрения пользователя.

standard.mapping.framework

Левый тип коллекции зависит от выбранного типа карты. Например, если тип карты равен<std::multimap>, то тип коллекции X равен<multiset_of>. В следующей таблице показаны эквивалентные типы ассоциативных контейнеров std.

Table 1.1. std associative containers

контейнер

Левый тип коллекции

Правильный тип коллекции

<map>

<set_of>

Никаких ограничений

<multimap>

<multiset_of>

Никаких ограничений

<unordered_map>

<unordered_set_of>

Никаких ограничений

<unordered_multimap>

<unordered_multiset_of>

Никаких ограничений


Повышаю. Дизайн Bimap основан на STL и естественным образом расширяет рамки. Следующая диаграмма представляет новую ситуацию.

extended.mapping.framework

Обратите внимание, что сейчас<std::maps>является частным случаем увеличения. Контейнер Bimap, в котором можно просматривать только одну сторону отношений и контролировать ограничения только одной из коллекций. Повышаю. Bimap позволяет пользователю просматривать отношения с трех точек зрения. Вы можете просматривать его с одной стороны, получая<std::map>совместимый контейнер, или вы можете работать непосредственно со всем соотношением.

The next diagram shows the layout of the relation and pairs of a bimap. It is the one from the one minute tutorial

relation.and.pair

Бимап-пары совместимы со стандартными парами, но отличаются от них. Как вы увидите в других разделах, они могут быть помечены именами пользователей, и к ним может быть добавлена дополнительная информация. Вы можете конвертировать из<std::pairs>в пары бимап напрямую, но обратное преобразование не предусмотрено. Это означает, что вы можете вставлять элементы в карту, используя алгоритмы, такие как<std::copy>из контейнеров<likestd::map>или использовать<std::make_pair>для добавления новых элементов. Однако лучше всего использовать<bm.left.insert(bm_type::left_value_type(f,s))>вместо<bm.insert(std::make_pair(f,s))>, чтобы избежать дополнительного вызова конструктору копий каждого типа.

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

[Note]Note

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

// Wrong: we forgot the & after bm_type::left_type
bm_type::left_map lm = bm.left;

не компилирует, так как пытается построить вид объекта<lm>. Это общий источник ошибок в коде пользователя.

Go to source code

template< class Map, class CompatibleKey, class CompatibleData >
void use_it( Map & m,
             const CompatibleKey  & key,
             const CompatibleData & data )
{
    typedef typename Map::value_type value_type;
    typedef typename Map::const_iterator const_iterator;
    m.insert( value_type(key,data) );
    const_iterator iter = m.find(key);
    if( iter != m.end() )
    {
        assert( iter->first  == key  );
        assert( iter->second == data );
        std::cout << iter->first << " --> " << iter->second;
    }
    m.erase(key);
}
int main()
{
    typedef bimap< set_of<std::string>, set_of<int> > bimap_type;
    bimap_type bm;
    // Standard map
    {
        typedef std::map< std::string, int > map_type;
        map_type m;
        use_it( m, "one", 1 );
    }
    // Left map view
    {
        typedef bimap_type::left_map map_type;
        map_type & m = bm.left;
        use_it( m, "one", 1 );
    }
    // Reverse standard map
    {
        typedef std::map< int, std::string > reverse_map_type;
        reverse_map_type rm;
        use_it( rm, 1, "one" );
    }
    // Right map view
    {
        typedef bimap_type::right_map reverse_map_type;
        reverse_map_type & rm = bm.right;
        use_it( rm, 1, "one" );
    }
    return 0;
}


PrevUpHomeNext

Статья Discovering the bimap framework раздела 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:05:57/0.0074169635772705/0