浙江省高等学校教师教育理论培训

微信搜索“毛凌志岗前心得”小程序

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

boost库之MultiIndex_星星的小窝_百度空间

boost库之MultiIndex

MultiIndex

 

它如同是多个STL容器的集合(vector, list, set, map, hash),能具备这一系列优点的原因是它允许多个比较谓词,从而存在多个索引。鉴于帮助文档中内容大多,我下面将以总结性的方式列出每页的主要信息。

 

定义一个multiindex,通常是使用typedef,因为它的定义实在很长(这是个好习惯)

 

typedef multi_index_container <

       class Key,

       indexed_by <

              ordered_unique< … >,                 // 索引#0, 无重复排序

              ordered_non_unique< … >,         // 索引#1, 有重复的排序

              sequenced<>,                             // #2,类list的索引方式

       >

> some_container;

some_container sc;

… …

 

index_by就是提供的索引方法。要获得某个索引,使用get<N>( ),例

 

const some_container::nth_index<1>::type &name_index = sc.get<1>( ); // get返回的是引用

 

现在假如我们有一系列的单词,想储存在一个容器中,要求能很快得出某个单词出现的次数,而且能按原来的顺序输出。

 

using boost::multi_index_container;

using namespace boost::multi_index;

 

vector<string>              vs;

… …

typedef multi_index_container<

       string,

       indexed_by<

              sequenced<>,

              ordered_non_unique<identity<std::string> >

       >

> text_container;

text_container tc;

copy(vs.begin( ), vs.end( ), back_inserter(tc));

text_container::nth_index<0>::type& seq_index = tc.get<0>( );

copy(seq_index.begin( ), seq_index.end( ), ostream_iterator<string>(cout, “ “));    

text_container::nth_index<1>::type& seq_index = tc.get<1>( );

int t = seq_index.count(“string”);

 

看了上面的示例,大概你已经明白它到底用来干什么了。编译这个例子通常容易出错的是忘记加上

using boost::multi_index_container;

using namespace boost::multi_index;

取之代之为

using namespace boost;

第一个不能编译的地方就是indexed_by未定义。indexed_by在名字空间boost::multi_index_container内,后面还有sequenced等。

 

在ordered_unique和ordered_non_unique的说明中要提供一个key extractor键提取器和一个可选的比较谓词。

 

key extraction 键提取

 

<略>

 

MultiIndex 小结

我准备放弃这一个库了,真的是太多太繁杂了。这个从数据库多重索引的观念发展出来的库,虽然非常有用,但内容太多了

posted on 2013-03-01 10:32  lexus  阅读(675)  评论(0编辑  收藏  举报