当前位置:  编程语言>c/c++

c++类库Boost::bimap(双向映射)介绍及使用实例

 
    发布时间:2013-10-24  


    本文导语:  Boost.Bimap 是一个C++的双向 map 库。使用 Boost.Bimap,你可以创建两个类型都可用作键值的关联容器。bimap<X,Y> 可以被视为 std::map<X,Y> 加上 std::map<Y,X>。如果你知道如何使用标准容器,那么 bimap 的学习曲线就几...

   boost.bimap 是一个c++的双向 map 库。使用 boost.bimap,你可以创建两个类型都可用作键值的关联容器。bimap<x,y> 可以被视为 std::map<x,y> 加上 std::map<y,x>。如果你知道如何使用标准容器,那么 bimap 的学习曲线就几乎是平的。在 boost.bimap 中作出了大量的努力,以符合stl命名规则。本库是按照与常见stl容器相匹配的方式进行设计的。记住,bm 可单独用作关系的 set。我们可以插入元素,或者使用该视图进行遍历

boost::bimap - 双向映射

定义一个 bimap :

#include bimap bm;

它有3个不同的视图:

bm.left : 是一个兼容于 std::map 类型的东西.

bm.right: 是一个兼容于 std:::map 类型的东西.

bm 是一个兼容于 std::set< relation 类型的东西.



例如我们有一个输出map的函数如下:

template< class MapType > void print_map(const MapType & m)
{
      typedef typename MapType::const_iterator const_iterator;
     for( const_iterator iter = m.begin(), iend = m.end(); iter != iend; ++iter )
      {
         std::cout << iter->first << "-->" << iter->second << std::endl;
       }
}

它的参数可以接受一个 std::map 对象. 所以它也可以接受如下调用:

print_map( bm.left );
print_map( bm.right );

下边我们定义一个整数字符串的双向映射:

typedef boost::bimap< int, std::string > bm_type;
 bm_type bm;

向其插入数据:

bm.insert( bm_type::value_type(1, "one" ) );
bm.insert( bm_type::value_type(2, "two" ) );

输出刚才插入的数据:

std::cout << "There are " << bm.size() << "relations" << std::endl; for( bm_type::const_iterator iter = bm.begin(), iend = bm.end(); iter != iend; ++iter )
 {
 std::cout << iter->left << " <--> " << iter->right << std::endl;
 }

接着我们使用它的 left 视图(就像在使用一个std::map): //left视图的迭代器类型

typedef bm_type::left_map::const_iterator left_const_iterator;
for( left_const_iterator left_iter = bm.left.begin(), iend = bm.left.end(); left_iter != iend; ++left_iter )
{
   std::cout << left_iter->first << " --> " << left_iter->second << std::endl;
}
bm_type::left_const_iterator left_iter = bm.left.find(2);
assert( left_iter->second == "two" ); // 再通过左视图向 bm 插入数据 //

它和直接用 bm.insert( bm_type::value_type(3,"three") ); 效果一样

bm.left.insert( bm_type::left_value_type( 3, "three" ) );

同样的. 我们可以使用它的 right视图 : // 通过 string 查找

bm_type::right_const_iterator right_iter = bm.right.find("two"); assert( right_iter->second == 2 ); // 调用 at() assert( bm.right.at("one") == 1 ); // 删除 "two" 对应的关系 bm.right.erase("two");

最后. 缺省时在 std::map 中. 我们插入 ("1", 1) 后再插入 ("one", 1) 是可以的.

但这在bimap中不行. 因为它左右两个都可以做键值. 要求它们两者都必须是唯一的. 但这只是它缺省时的样子. bimap可以通过模板参数来定制它一些特征: 例如可以指定是否需要 一对多 的映射关系: 可以一个 x 对应多个 y. 可以多个 x 对应一个 y. 也可以多个 x 对应多个 y. 还可以指定是否要求 left视图 或 right视图 或 两者 有序. 如果不要求有序的话. 它可以用 hash表来实现底层.

 再提供一段完整实例代码如下:

// bimap.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <boost/bimap.hpp>
class PhoneManager {
public:
    PhoneManager( void ) { Init( ); }
    void Init( void );
    void ListAll( void ) const;
    std::string GetCityByAreacode( std::string strAreacode ) const;
    std::string GetAreacodeByCity( std::string strCity ) const;
private:
    typedef boost::bimap<std::string,std::string> bm_type;
    typedef bm_type::left_const_iterator left_const_iterator;
    typedef bm_type::right_const_iterator right_const_iterator;
    bm_type _bmValues;
};
int _tmain(int argc, _TCHAR* argv[])
{
    PhoneManager pm;
    pm.ListAll( );
    std::cout << "=========================Test=Result===============================n";
    std::cout << "find 南宁" << "n     result is:" << pm.GetAreacodeByCity( "南宁" ) << 'n';
    std::cout << "find 梧州" << "n     result is:" << pm.GetAreacodeByCity( "梧州" ) << 'n';
    std::cout << "find 0771" << "n     result is:" << pm.GetCityByAreacode( "0771" ) << 'n';
    std::cout << "find 0774" << "n     result is:" << pm.GetCityByAreacode( "0774" ) << 'n';
    std::cin.get( );
    return 0;
}
void PhoneManager::Init( void )
{
    _bmValues.insert( bm_type::value_type( "0771", "南宁" ) );
    _bmValues.insert( bm_type::value_type( "0772", "柳州" ) );
    _bmValues.insert( bm_type::value_type( "0773", "桂林" ) );
}
std::string PhoneManager::GetAreacodeByCity( std::string strCity ) const
{
    right_const_iterator it;
    it = _bmValues.right.find( strCity );
    if ( it != _bmValues.right.end( ) )
        return it->second;
    return "";
}
std::string PhoneManager::GetCityByAreacode( std::string strAreacode ) const
{
    left_const_iterator it;
    it = _bmValues.left.find( strAreacode );
    if ( it != _bmValues.left.end( ) )
        return it->second;
    return "";
}
void PhoneManager::ListAll( void ) const
{
    left_const_iterator it;
    for ( it = _bmValues.left.begin( ); it != _bmValues.left.end( ); ++it ) {
        std::cout << it->first << ' ' << it->second << 'n';
    }
}


  • 本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载,整理或搜集自网络.欢迎任何形式的转载,转载请注明出处.
    转载请注明:文章转载自:[169IT-IT技术资讯]
    本文标题:c++类库Boost::bimap(双向映射)介绍及使用实例
相关文章推荐:


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3