1

マルチインデックスコンテナがあるとします:

#include <iostream>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/random_access_index.hpp>
#include <boost/multi_index/tag.hpp>
#include <boost/multi_index/key_extractors.hpp>

struct A{
A(int i){id=i;}
    int id;
};

typedef boost::multi_index::multi_index_container<
    A * ,
    boost::multi_index::indexed_by<
        boost::multi_index::random_access<
            boost::multi_index::tag<by_insertion>
        >, // this index represents insertion order
        boost::multi_index::hashed_unique<
            boost::multi_index::tag<by_id>,
            boost::multi_index::member<A, int, &A::id>
        >
    >
> MapType;

MapType map;

map.get<1>().insert(new A(1));
map.get<1>().insert(new A(2));

(*map.get<1>().find(1))->id=4; // HERE IF I CHANGE THE KEY, I CAN NOT FIND either key=4 or 1

MapType::nth_index<1>::type::iterator it = map.get<1>().find(4);
if(it != map.get<1>().end() ){
    std::cout << "FOUND A:" << *it << std::endl;
} // DOES NOT WORK?? WHY CANT I FIND the ELement with Key 4?

問題は、いくつかのキーを変更するときに、おそらくboost::multi_index::member<A, int, &A::a>間違って設定したことです。key = 4 の要素が見つかりませんか?

ここで間違って使用されているものは何ですか? どんな助けでも本当に感謝しています!

4

2 に答える 2

1

いいえ、ハッシュ化されたインデックスはハッシュ値を保存しません。常にその場で計算します。キーを変更したいのに、古い値で検索し続けるのはなぜですか?

于 2013-07-25T13:31:51.793 に答える
1

Gabriel の最後のコメントへの回答: 要素への書き込みアクセス権を持つためだけにポインターのコンテナーを使用するのはやり過ぎです。代わりに、次のいずれかを実行できます。

  • を使用modify()して、何らかのキーがタッチされた結果、変更された要素を再配置する必要があるかどうかを確認します。
  • キーを変更しないことがわかっている場合は、好きなようにキャストしconst_cast<A&>()て変更してください。

一般に、Boost.MultiIndex には、要素のキー以外の部分にのみ書き込みアクセスを許可する方法がありません。

于 2013-07-28T11:54:44.810 に答える