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

The collection of relations type

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

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

collection.type.of.relation

По умолчанию, "Боуст". Bimap будет основывать тип коллекции отношения на типе левой коллекции. Если левый тип коллекции представляет собой набор, то тип коллекции отношения будет иметь такой же порядок, как и левый вид.

Вообще-то, "Боуст". Пользователи Bimap будут основывать тип коллекции на типе коллекции на одной из двух сторон. Однако бывают случаи, когда полезно дать этой коллекции другие ограничения или просто заказать ее по-другому. Пользователю разрешается выбирать между:

  • left_based
  • right_based
  • set_of_relation<>
  • multiset_of_relation<>
  • unordered_set_of_relation<>
  • unordered_multiset_of_relation<>
  • list_of_relation
  • вектор_of_relation
  • unconstrained_set_of_relation
[Tip]Tip

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

more.bimap.structures

Тип связи коллекции может быть использован для создания мощных контейнеров. Например, если вам нужно максимизировать скорость поиска, то лучшая двунаправленная карта возможна, которая относится к элементам от unordered_set к другой unordered_set. Проблема в том, что этот контейнер нельзя итерировать. Если вам нужно знать список отношений внутри контейнера, вам нужен другой тип отношений коллекции. В этом случае list_of_relation является хорошим выбором. В результате контейнер торгует временем вставки и удаления против возможностей быстрого поиска и возможности двунаправленной итерации.

Go to source code

#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 доступен пользователям бикарты.

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

имя

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

left_based

Не шаблон.

right_based

Не шаблон.

set_of_relation<KeyComp>

multiset_of_relation<KeyComp>

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

unordered_set_of_relation<HashFunctor,EqualKey>

unordered_multiset_of_relation<HashFunctor<34>,EqualKey>>>

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

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

list_of_relation

Не шаблон.

vector_of_relation

Не шаблон.

unconstrained_set_of_relation

Не шаблон.

Рассмотрим этот пример:

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;

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


PrevUpHomeNext

Статья The collection of relations type раздела 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:17:52/0.010183811187744/1