![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
The collection of relations typeBoost , Chapter 1. Boost.Bimap , The tutorial
|
![]() | Tip |
---|---|
Первые два варианта и последние производят более быстрые бикарты, поэтому предпочитают их там, где это возможно. |
Тип связи коллекции может быть использован для создания мощных контейнеров. Например, если вам нужно максимизировать скорость поиска, то лучшая двунаправленная карта возможна, которая относится к элементам от unordered_set
к другой unordered_set
. Проблема в том, что этот контейнер нельзя итерировать. Если вам нужно знать список отношений внутри контейнера, вам нужен другой тип отношений коллекции. В этом случае list_of_relation
является хорошим выбором. В результате контейнер торгует временем вставки и удаления против возможностей быстрого поиска и возможности двунаправленной итерации.
#include <iostream> #include <string> #include <boost/bimap/bimap.hpp> #include <boost/bimap/list_of.hpp> #include <boost/bimap/unordered_set_of.hpp> struct english {}; struct spanish {}; int main() { using namespace boost::bimaps; typedef bimap < unordered_set_of< tagged< std::string, spanish > >, unordered_set_of< tagged< std::string, english > >, list_of_relation > translator; translator trans; // We have to use `push_back` because the collection of relations is // a `list_of_relation` trans.push_back( translator::value_type("hola" ,"hello" ) ); trans.push_back( translator::value_type("adios" ,"goodbye" ) ); trans.push_back( translator::value_type("rosa" ,"rose" ) ); trans.push_back( translator::value_type("mesa" ,"table" ) ); std::cout << "enter a word" << std::endl; std::string word; std::getline(std::cin,word); // Search the queried word on the from index (Spanish) translator::map_by<spanish>::const_iterator is = trans.by<spanish>().find(word); if( is != trans.by<spanish>().end() ) { std::cout << word << " is said " << is->get<english>() << " in English" << std::endl; } else { // Word not found in Spanish, try our luck in English translator::map_by<english>::const_iterator ie = trans.by<english>().find(word); if( ie != trans.by<english>().end() ) { std::cout << word << " is said " << ie->get<spanish>() << " in Spanish" << std::endl; } else { // Word not found, show the possible translations std::cout << "No such word in the dictionary" << std::endl; std::cout << "These are the possible translations" << std::endl; for( translator::const_iterator i = trans.begin(), i_end = trans.end(); i != i_end ; ++i ) { std::cout << i->get<spanish>() << " <---> " << i->get<english>() << std::endl; } } } return 0; }
Каждый тип отношений коллекции имеет различные параметры для контроля своего поведения. Например, в спецификации set_of_relation
вы можете пройти тип Functor, который сравнивает два типа. Все параметры точно так же, как и в стандартных библиотечных контейнерах, за исключением типа, который установлен на бикартовое отношение и тип аллокатора. Чтобы помочь пользователям в создании каждого фанктора, тип коллекции шаблонов отношений занимает выражение mpl lambda, где тип отношений будет оценен позже. Домовладелец по имени _relation
доступен пользователям бикарты.
В следующей таблице перечислены значения параметров для каждого типа отношений коллекции.
имя |
Дополнительные параметры |
---|---|
| Не шаблон. |
| Не шаблон. |
| KeyComp - это Functor, который сравнивает два типа, используя меньше. По умолчанию менее оператором является |
| HashFunctor преобразует EqualKey является Functor, который тестирует два отношения для равенства. По умолчанию оператором равенства является |
| Не шаблон. |
| Не шаблон. |
| Не шаблон. |
Рассмотрим этот пример:
template< class Rel > struct RelOrder { bool operator()(Rel ra, Rel rb) const { return (ra.left+ra.right) < (rb.left+rb.right); } }; typedef bimap < multiset_of< int >, multiset_of< int >, set_of_relation< RelOrder<_relation> > > bimap_type;
Здесь открывается вид на отношение двух карт с использованием информации обеих сторон. Этот контейнер будет разрешать уникальные отношения только потому, что set_of_relation
был использован, но элементы в каждой стороне бикарты могут быть повторены.
struct name {}; struct phone_number {}; typedef bimap < tagged< unordered_multiset_of< string >, name >, tagged< unordered_set_of < int >, phone_number >, set_of_relation<> > bimap_type;
В этом другом случае двухкарта будет относиться к номерам телефонов. Имена могут быть повторены, а номера телефонов уникальны. Вы можете выполнить быстрый поиск по имени или номеру телефона, и контейнер можно просмотреть, используя вид на связь.
Статья The collection of relations type раздела Chapter 1. Boost.Bimap The tutorial может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: The tutorial ::
реклама |