![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Discovering the bimap frameworkBoost , Chapter 1. Boost.Bimap , The tutorial
|
контейнер |
Левый тип коллекции |
Правильный тип коллекции |
---|---|---|
< | < | Никаких ограничений |
< | < | Никаких ограничений |
< | < | Никаких ограничений |
< | < | Никаких ограничений |
Повышаю. Дизайн Bimap основан на STL и естественным образом расширяет рамки. Следующая диаграмма представляет новую ситуацию.
Обратите внимание, что сейчас<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
Бимап-пары совместимы со стандартными парами, но отличаются от них. Как вы увидите в других разделах, они могут быть помечены именами пользователей, и к ним может быть добавлена дополнительная информация. Вы можете конвертировать из<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 |
---|---|
Вы должны использовать ссылки на взгляды, а не непосредственно на объекты. Виды не могут быть построены как отдельные объекты из контейнера, к которому они принадлежат. // Wrong: we forgot the & after bm_type::left_type bm_type::left_map lm = bm.left; не компилирует, так как пытается построить вид объекта< |
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; }
Статья Discovering the bimap framework раздела Chapter 1. Boost.Bimap The tutorial может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: The tutorial ::
реклама |