boost建模,BOOSTA
Boost bimap学习笔记-胜者为王!博客频道。CSDN。网
增强bimap研究笔记
分类:
促进
2012-02-24 14:50
79人阅读
评论(0)
收集
Reporting bimap是boost中的一个重要容器,可以双向查找和替换,弥补了if map和multimap需要查找数据对应的键值的不足。遍历元素,找到相应的键值,然后删除它,最后替换它。
但是boost的模板源码编程有先天不足,就是编译错误不容易发现,编译时间有点长。但如果长期使用boost,知道常见的错误,这个缺点还是可以慢慢克服的;虽然编译时间有点长,但比起一行一行写,还是合理的。
以下是一些必需的标题。如果单纯用bimap,引入#include就好了。
[html]查看plaincopyprint?
# include iostream # include map # include boost/foreach . HPP # include boost/type of/type of . HPP # include boost/bimap/set _ of . HPP # include boost/bimap/vector _ of . HPP//# include boost/bimap/tags/tagged . HPP using namespace boost:bimaps;使用usingnamespaceboostusingnamespacestd#包括iostream
#包含地图
#包含boost/foreach.hpp
# include boost/type of/type of . HPP
#包含boost/bimap.hpp
#包含boost/bimap/set_of.hpp
#包含boost/bimap/vector_of.hpp
//#包含boost/bimap/tags/tagged.hpp
使用命名空间boost:bi maps;
使用命名空间增强;
using命名空间std先写一个打印bimap的工具函数,不仅可以打印bimap,还可以打印map和multimap。
这里用的是Boost中常用的Boost _ auto和BOOST_FOREACH。我个人更喜欢我写的第一个实现。
如果在程序中灵活使用boost的一些宏,可以生成很多代码。
这里BOOST_FOREACH比BOOST_AUTO更简洁。但是想象一下,如果不能使用这两个,for循环的第一个参数应该写多长。
[html]查看plaincopyprint?
//打印所有元素模板类void Print _ map(t m){//首选方法是Boost _ foreach (t: value _ typev,m){ cout v . first v . second endl;}//模式2 //for(BOOST_AUTO(pos,m . begin());pos!=m . end();pos)//{//cout pos-first - pos-second endl;//} }//打印所有元素
模板类别t
voidprint_map(T m)
//模式1是首选模式。
BOOST_FOREACH(T:值类型v,m)
cout v . first v . second endl;
//模式2
//for (BOOST_AUTO(pos,m . begin());pos!=m . end();位置)
//cout pos-first - pos-second endl;
}
请记住,简单的bimap键/值在两个方向上都必须是唯一的,尽管以后可以更改此规则。
[html]查看plaincopyprint?
typedefbimap int,STD:string BM _ t;typedefbimap int,STD:string BM _ t;如果插入的值不唯一,将显示第一次插入的结果。
以下是左值重复插入测试。
[html]查看plaincopyprint?
intmain(){std:map int,int test//先创建test[1]=2;//再次修改test[1]=4;cout test[1]endl;//结果:4//用4//bimap左值重复测试bm _ tcolcol.left.insert(make_pair(5, hello ));//虽然无效,但是可以插入col.left.insert (make _ pair (5, world ));//测试显示第一个插入的值boost _ auto (ITER,col . left . find(5));cout left euql: ITER-second endl;//结果:hello//bimap right value重复测试col . right . insert(make _ pair( hello ,10));BOOST_AUTO(iter2,col . right . find( hello );//对于右值查询,常量输出的方向应该相反。最初对seoond//test的第一个更改还显示了第一个插入的值cout right equal: ITER 2-secondendl;//Result: 5intmain()
std:map int,int test
//首先创建它
test[1]=2;
//再次修改
test[1]=4;
cout test[1]endl;//结果:4
//bimap左值重复测试
bm _ t col
col.left.insert(make_pair(5, hello ));
//虽然无效,但是可以插入
col.left.insert(make_pair(5, world ));
//测试显示第一次插入的值
BOOST_AUTO(iter,col . left . find(5));
cout left euql: ITER-second endl;//结果:你好
//bimap右值重复测试
col . right . insert(make _ pair( hello ,10));
BOOST_AUTO(iter2,col . right . find( hello );
//对于右值查询,常量输出的方向应该相反,原第一变第二次
//测试同样显示的是第一次插入的值
cout right equal: ITER 2秒endl//结果:5
不能使用地图的方式要访问简单的bimap,否则会造成
编译错误,提示错误c 2664:" boost:mpl:assertion _ failed ":无法从" boost:mpl:失败"转换参数一
对于模版源编程,熟悉一些错误对程序的纠错是非常有好处的
虽然不能像关联数组一样使用运算符[],但这个不是绝对的。
可以使用来使用操作员[]
[html]查看plaincopyprint?
cout col . left[5]endl;cout col . left[5]endl;下面是右值重复插入测试
[html]查看plaincopyprint?
typedefbm _ t:value _ type val;//不使用左右视图,使用值类型插入元素col.insert(val(50测试值类型));typedefbm _ t:left _ value _ type left _ val;//使用左值类型插入元素//同理右值类型插入元素col.left.insert(left_val(100,左值类型));//传入一个左视图的结果集print _ map(左列);typedefbm _ t:value _ type val;
//不使用左右视图,使用值类型插入元素
col.insert(val(50测试值类型));
typedefbm _ t:left _ value _ type left _ val;
//使用左值类型插入元素
//同理右值类型插入元素
col.left.insert(left_val(100,左值类型));
//传入一个左视图的结果集
print _ map(左列);
使用双向映射库的一些类和方法可以使用可以使用运算符[],而且可以不唯一键/值的bimap,但必须保证左视图为有序,右视图为随意访问类型。
[html]查看plaincopyprint?
bimap boost:bimaps:set_of int,boost:bi maps:vector _ of STD:string BM _ multi;BM _ multi。向左。insert(make _ pair(1, 111 ));BM _ multi。left[2]= 222 ;BM _ multi。left[300]= bimap ;“cout”使用运算符:“BM _ multi。left[300]endl;打印地图(BM _ multi。左);//输出//1111//2222//300 bimapbimap boost:bimaps:set _ of int,boost:bimaps:vector _ of STD:string BM _ multi;
BM _ multi。向左。insert(make _ pair(1, 111 ));
BM _ multi。left[2]= 222 ;
BM _ multi。left[300]= bimap ;
cout 使用运算符: BM _ multi。left[300]endl;
打印地图(BM _ multi。左);
//1 111
//2 222
//300 bimap
对于常见的访问类型,见下:
集合_of,多重集合_of,无序_集合_of,无序_多重集合_of:可以做键值索引
list_of,vector_of,unconstrained_set_of:不能用作键值索引
关于这部分的具体内容可以参考《Boost程序库完全开发指南》 P264
关于增强双地图的已标记,使用增强标记给左右视图增加标签这个功能在相对下不太稳定,但也可能是本人编译器的问题
[html]查看plaincopyprint?
bimap tagged int,structid,tagged std:string,struct name BM _ tag _ test BM _ tag _ test . by id { } .insert(make_pair(1, hello ));bm_tag_test.by id {} .insert(make_pair(2, world ));BM _ tag _ test . by name { } insert(make _ pair( test ,3));print _ map(BM _ tag _ test。按名字());bimap标记int,structid,标记std:string,structname bm _ tag _ test
bm_tag_test.by id {} .insert(make_pair(1, hello ));
bm_tag_test.by id {} .insert(make_pair(2, world ));
BM _ tag _ test . by name { } insert(make _ pair( test ,3));
print_map(bm_tag_test.by name
}
关于双向映射的投射和替换,查找,修改功能,下次再给出详细说明。
分享到:
上一篇:std:find,set.find,multiset.find,map.find和multimap.find算法总结下一篇:STL容器里存放对象还是指针