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

Bimaps with user defined names

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

В следующем примере пользователь библиотеки вставил комментарии для руководства будущими программистами:

Перейти к исходному коду

typedef bimap
<
    multiset_of<std::string>,
    int
> People;
People people;
// ...
int user_id;
std::cin >> user_id;
// people.right : map<id,name>
People::right_const_iterator id_iter = people.right.find(user_id);
if( id_iter != people.right.end() )
{
    // first  : id
    // second : name
    std::cout << "name: " << id_iter->second << std::endl
              << "id:   " << id_iter->first  << std::endl;
}
else
{
    std::cout << "Unknown id, users are:" << std::endl;
    // people.left : map<name,id>
    for( People::left_const_iterator
            name_iter = people.left.begin(),
            iend      = people.left.end();
         name_iter != iend; ++name_iter )
    {
        // first  : name
        // second : id
        std::cout << "name: " << name_iter->first  << std::endl
                  << "id:   " << name_iter->second << std::endl;
    }
}

В Росте. В Bimap есть лучший способ документировать код и тем временем помочь вам написать более удобный и читаемый код. Вы можете пометить две коллекции карты, чтобы к ним можно было получить доступ с помощью более описательных имен.

tagged

Тегированный тип - это тип, который был помечен с помощью тега. Тег - любой действительный тип C++. В бимапе типы всегда помечены. Если вы не указали свой собственный тег, контейнер использует<member_at::left>и<member_at::right>для обозначения левой и правой сторон соответственно. Чтобы указать пользовательский тег, тип каждой стороны должен быть помечен. Пометить тип очень просто:

typedef tagged< int, a_tag > tagged_int;

Теперь мы можем переписать пример:

Перейти к исходному коду

struct id   {}; // Tag for the identification number
struct name {}; // Tag for the name of the person
typedef bimap
<
                 tagged< int        , id   >  ,
    multiset_of< tagged< std::string, name > >
> People;
People people;
// ...
int user_id;
std::cin >> user_id;
People::map_by<id>::const_iterator id_iter = people.by<id>().find(user_id);
if( id_iter != people.by<id>().end() )
{
    std::cout << "name: " << id_iter->get<name>() << std::endl
              << "id:   " << id_iter->get<id>()   << std::endl;
}
else
{
    std::cout << "Unknown id, users are:" << std::endl;
    for( People::map_by<name>::const_iterator
            name_iter = people.by<name>().begin(),
            iend      = people.by<name>().end();
        name_iter != iend; ++name_iter )
    {
        std::cout << "name: " << name_iter->get<name>() << std::endl
                  << "id:   " << name_iter->get<id>()   << std::endl;
    }
}

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

struct Left  {};
struct Right {};
typedef bimap<
         multiset_of< tagged< int, Left  > >,
    unordered_set_of< tagged< int, Right > >
> bm_type;
bm_type bm;
//...
bm_type::iterator       iter       = bm.begin();
bm_type::left_iterator  left_iter  = bm.left.begin();
bm_type::right_iterator right_iter = bm.right.begin();

Table 1.3. Equivalence of expresions using user defined names

Untagged версия

Tagged версия

<bm.left>

<bm.by<Left>()>

<bm.right>

<bm.by<Right>()>

<bm_type::left_map>

<bm::map_by<Left>::type>

<bm_type::right_value_type>

<bm::map_by<Right>::value_type>

<bm_type::left_iterator>

<bm::map_by<Left>::iterator>

<bm_type::right_const_iterator>

<bm::map_by<Right>::const_iterator>

<iter->left>

<iter->get<Left>()>

<iter->right>

<iter->get<Right>()>

<left_iter->first>

<left_iter->get<Left>()>

<left_iter->second>

<left_iter->get<Right>()>

<right_iter->first>

<right_iter->get<Right>()>

<right_iter->second>

<right_iter->get<Left>()>

<bm.project_left(iter)>

<bm.project<Left>(iter)>

<bm.project_right(iter)>

<bm.project<Right>(iter)>



PrevUpHomeNext

Статья Bimaps with user defined names раздела 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:38/0.007023811340332/0