Simple Bimap

| Home | Libraries | People | FAQ | More

### Simple Bimap

This is the example from the one minute tutorial section.

Go to source code

    #include <string>
    #include <iostream>

    #include <boost/bimap.hpp>

    template< class MapType >
    void print_map(const MapType & map,
                   const std::string & separator,
                   std::ostream & os )
    {
        typedef typename MapType::const_iterator const_iterator;

        for( const_iterator i = map.begin(), iend = map.end(); i != iend; ++i )
        {
            os << i->first << separator << i->second << std::endl;
        }
    }

    int main()
    {
        // Soccer World cup

        typedef boost::bimap< std::string, int > results_bimap;
        typedef results_bimap::value_type position;

        results_bimap results;
        results.insert( position("Argentina"    ,1) );
        results.insert( position("Spain"        ,2) );
        results.insert( position("Germany"      ,3) );
        results.insert( position("France"       ,4) );

        std::cout << "The number of countries is " << results.size()
                  << std::endl;

        std::cout << "The winner is " << results.right.at(1)
                  << std::endl
                  << std::endl;

        std::cout << "Countries names ordered by their final position:"
                  << std::endl;

        // results.right works like a std::map< int, std::string >

        print_map( results.right, ") ", std::cout );

        std::cout << std::endl
                  << "Countries names ordered alphabetically along with"
                        "their final position:"
                  << std::endl;

        // results.left works like a std::map< std::string, int >

        print_map( results.left, " ends in position ", std::cout );

        return 0;
    }

You can rewrite it using tags to gain readability.

Go to source code

    #include <iostream>

    #include <boost/bimap.hpp>

    struct country  {};
    struct place    {};

    int main()
    {
        using namespace boost::bimaps;

        // Soccer World cup.

        typedef bimap
        <
            tagged< std::string, country >,
            tagged< int        , place   >

        > results_bimap;

        typedef results_bimap::value_type position;

        results_bimap results;
        results.insert( position("Argentina"    ,1) );
        results.insert( position("Spain"        ,2) );
        results.insert( position("Germany"      ,3) );
        results.insert( position("France"       ,4) );

        std::cout << "Countries names ordered by their final position:"
                    << std::endl;

        for( results_bimap::map_by<place>::const_iterator
                i    = results.by<place>().begin(),
                iend = results.by<place>().end() ;
                i != iend; ++i )
        {
            std::cout << i->get<place  >() << ") "
                      << i->get<country>() << std::endl;
        }

        std::cout << std::endl
                  << "Countries names ordered alfabetically along with"
                     "their final position:"
                  << std::endl;

        for( results_bimap::map_by<country>::const_iterator
                i    = results.by<country>().begin(),
                iend = results.by<country>().end() ;
                i != iend; ++i )
        {
            std::cout << i->get<country>() << " ends "
                      << i->get<place  >() << "º"
                      << std::endl;
        }

        return 0;
    }

| `results.by<place>()` is equivalent to `results.right`
| `get<Tag>` works for each view of the bimap
| `results.by<country>()` is equivalent to `results.left`