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