boost建模,BOOSTA

  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容器里存放对象还是指针

boost建模,BOOSTA