Вот пример 4 в башне. Документация MultiIndex.
Перейти к исходному коду
#include <iostream>
#include <boost/tokenizer.hpp>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/key_extractors.hpp>
#include <boost/multi_index/ordered_index.hpp>
using namespace boost;
using namespace boost::multi_index;
struct from {};
struct to {};
template<typename FromType,typename ToType>
struct bidirectional_map
{
typedef std::pair<FromType,ToType> value_type;
typedef multi_index_container<
value_type,
indexed_by
<
ordered_unique
<
tag<from>, member<value_type,FromType,&value_type::first>
>,
ordered_unique
<
tag<to>, member<value_type,ToType,&value_type::second>
>
>
> type;
};
typedef bidirectional_map<std::string,std::string>::type dictionary;
int main()
{
dictionary d;
d.insert(dictionary::value_type("hola","hello"));
d.insert(dictionary::value_type("adios","goodbye"));
d.insert(dictionary::value_type("rosa","rose"));
d.insert(dictionary::value_type("mesa","table"));
std::cout << "enter a word" << std::endl;
std::string word;
std::getline(std::cin,word);
dictionary::iterator it = d.get<from>().find(word);
if( it != d.end() )
{
std::cout << word << " is said "
<< it->second << " in English" << std::endl;
}
else
{
dictionary::index_iterator<to>::type it2 = d.get<to>().find(word);
if( it2 != d.get<to>().end() )
{
std::cout << word << " is said "
<< it2->first << " in Spanish" << std::endl;
}
else
{
std::cout << "No such word in the dictionary" << std::endl;
}
}
return 0;
}
Перейти к исходному коду
#include <iostream>
#include <boost/tokenizer.hpp>
#include <boost/bimap/bimap.hpp>
using namespace boost::bimaps;
typedef bimap<std::string,std::string> dictionary;
typedef dictionary::value_type translation;
int main()
{
dictionary d;
d.insert( translation("hola" ,"hello" ));
d.insert( translation("adios","goodbye"));
d.insert( translation("rosa" ,"rose" ));
d.insert( translation("mesa" ,"table" ));
std::cout << "enter a word" << std::endl;
std::string word;
std::getline(std::cin,word);
dictionary::left_const_iterator it = d.left.find(word);
if( it != d.left.end() )
{
std::cout << word << " is said "
<< it->second
<< " in English" << std::endl;
}
else
{
dictionary::right_const_iterator it2 = d.right.find(word);
if( it2 != d.right.end() )
{
std::cout << word << " is said "
<< it2->second
<< " in Spanish" << std::endl;
}
else
{
std::cout << "No such word in the dictionary" << std::endl;
}
}
return 0;
}

| он является итератором левого взгляда, поэтомуон->второй относится к правому элементу отношения, слово в английском языке
|

| it2 является итератором правого взгляда, поэтомуit2->второй относится к левому элементу отношения, слово на испанском языке
|
Или лучше, используя теги...
Перейти к исходному коду
#include <iostream>
#include <boost/bimap/bimap.hpp>
using namespace boost::bimaps;
struct spanish {};
struct english {};
typedef bimap
<
tagged< std::string,spanish >, tagged< std::string,english >
> dictionary;
typedef dictionary::value_type translation;
int main()
{
dictionary d;
d.insert( translation("hola" ,"hello" ));
d.insert( translation("adios","goodbye"));
d.insert( translation("rosa" ,"rose" ));
d.insert( translation("mesa" ,"table" ));
std::cout << "enter a word" << std::endl;
std::string word;
std::getline(std::cin,word);
dictionary::map_by<spanish>::const_iterator it =
d.by<spanish>().find(word);
if( it != d.by<spanish>().end() )
{
std::cout << word << " is said "
<< it->get<english>() << " in English" << std::endl;
}
else
{
dictionary::map_by<english>::const_iterator it2 =
d.by<english>().find(word);
if( it2 != d.by<english>().end() )
{
std::cout << word << " is said "
<< it2->get<spanish>() << " in Spanish" << std::endl;
}
else
{
std::cout << "No such word in the dictionary" << std::endl;
}
}
return 0;
}