Boost マルチインデックス イテレータから数値インデックスを取得します
-
26-09-2019 - |
質問
以下のものを大量に保存しています
struct Article {
std::string title;
unsigned db_id; // id field in MediaWiki database dump
};
Boost.MultiIndex コンテナ内で、次のように定義されます。
typedef boost::multi_index_container<
Article,
indexed_by<
random_access<>,
hashed_unique<tag<by_db_id>,
member<Article, unsigned, &Article::db_id> >,
hashed_unique<tag<by_title>,
member<Article, std::string, &Article::title> >
>
> ArticleSet;
これで 2 つのイテレータができました。1 つは次のとおりです。 index<by_title>
そしてからの1つ index<by_id>
. 。データメンバーを追加せずに、これらをコンテナーのランダムアクセス部分のインデックスに変換する最も簡単な方法は何ですか? struct Article
?
解決
すべてのインデックスは、次を使用した値によるイテレータの生成をサポートしています。 iterator_to. 。1 つのインデックスにターゲット値へのイテレータがすでにある場合は、これを使用して別のインデックスのイテレータに変換できます。
iterator iterator_to(const value_type& x);
const_iterator iterator_to(const value_type& x)const;
インデックスへの変換については、おそらく次のモデルに従うことができます。 random_access_index.hpp
:
iterator erase(iterator first,iterator last)
{
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(first);
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(last);
BOOST_MULTI_INDEX_CHECK_IS_OWNER(first,*this);
BOOST_MULTI_INDEX_CHECK_IS_OWNER(last,*this);
BOOST_MULTI_INDEX_CHECK_VALID_RANGE(first,last);
BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT;
difference_type n=last-first;
relocate(end(),first,last);
while(n--)pop_back();
return last;
}
他のヒント
iterator_to
のですブーストでは比較的新しい機能(それは1.35以降があります)。デフォルトのインデックスを使用している場合にはシンタックスシュガーの少しを追加します。機能を高める project
<古いバージョンのための/>唯一の一品です。あなたは project
のように使用することができます次の:
ArticleSet x;
// consider we've found something using `by_db_id` index
ArticleSet::index_const_iterator<by_db_id>::type it =
x.get<by_db_id>().find( SOME_ID );
// convert to default index ( `random_access<>` )
ArticleSet::const_iterator it1 = x.project<0>( it );
// iterator_to looks like:
ArticleSet::const_iterator it11 = x.iterator_to( *it );
// convert to index tagged with `by_title` tag
ArticleSet::index_const_iterator<by_title>::type it2 = x.project<by_title>( it );
// iterator_to doen't look better in this case:
ArticleSet::index_const_iterator<by_title>::type it2 = x.get<by_title>().iterator_to( *it );
// etc.
所属していません StackOverflow