Frage

Ich bin Speichern von ein paar der folgenden

struct Article {
    std::string title;
    unsigned db_id;     // id field in MediaWiki database dump
};

in einem Boost.Multiindex Behälter, definiert als

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;

Jetzt habe ich zwei Iteratoren bekommt, ein von index<by_title> und einer aus index<by_id>. Was ist der einfachste Weg, diese Indizes in den Direktzugriffs Teil des Behälters zu verwandeln, ohne ein Datenelement zu struct Article hinzufügen?

War es hilfreich?

Lösung

Jeder Index unterstützt die Erzeugung eines Iterator durch Wert mit iterator_to . Wenn Sie bereits ein Iterator auf den Zielwert in einem Index haben, können Sie diese zu konvertieren zu einem Iterator in einem anderen Index verwenden.

iterator       iterator_to(const value_type& x);
const_iterator iterator_to(const value_type& x)const;

Für die Umstellung auf Index können Sie wahrscheinlich das Modell in random_access_index.hpp folgen:

  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;
  }

Andere Tipps

iterator_to eine relativ neue Funktion in Boost (es ist dort seit 1.35). Es fügt ein wenig von der Syntax Zucker, wenn sie mit Standard-Index. Bei älteren Versionen von Boost-Funktion project ist die einzige Wahl. Sie können verwenden project als folgt:

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.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top