В следующем примере пользователь библиотеки вставил комментарии для руководства будущими программистами:
Перейти к исходному коду
typedef bimap
<
multiset_of<std::string>,
int
> People;
People people;
int user_id;
std::cin >> user_id;
People::right_const_iterator id_iter = people.right.find(user_id);
if( id_iter != people.right.end() )
{
std::cout << "name: " << id_iter->second << std::endl
<< "id: " << id_iter->first << std::endl;
}
else
{
std::cout << "Unknown id, users are:" << std::endl;
for( People::left_const_iterator
name_iter = people.left.begin(),
iend = people.left.end();
name_iter != iend; ++name_iter )
{
std::cout << "name: " << name_iter->first << std::endl
<< "id: " << name_iter->second << std::endl;
}
}
В Росте. В Bimap есть лучший способ документировать код и тем временем помочь вам написать более удобный и читаемый код. Вы можете пометить две коллекции карты, чтобы к ним можно было получить доступ с помощью более описательных имен.

Тегированный тип - это тип, который был помечен с помощью тега. Тег - любой действительный тип C++. В бимапе типы всегда помечены. Если вы не указали свой собственный тег, контейнер использует<member_at::left
>и<member_at::right
>для обозначения левой и правой сторон соответственно. Чтобы указать пользовательский тег, тип каждой стороны должен быть помечен. Пометить тип очень просто:
typedef tagged< int, a_tag > tagged_int;
Теперь мы можем переписать пример:
Перейти к исходному коду
struct id {};
struct name {};
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) > |