سؤال

أنا أقوم بتخزين مجموعة من ما يلي

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;

الآن لدي اثنين من التكرار ، واحد من index<by_title> وواحد من index<by_id>. ما هي أسهل طريقة لتحويل هذه الفهارس إلى جزء الوصول العشوائي من الحاوية ، دون إضافة عضو في البيانات إلى struct Article?

هل كانت مفيدة؟

المحلول

يدعم كل فهرس توليد مؤلف من القيمة باستخدام القيمة iterator_to. إذا كان لديك بالفعل مؤلف إلى القيمة الهدف في فهرس واحد ، فيمكنك استخدام هذا للتحويل إلى مؤلف في فهرس آخر.

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.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top