boost::multi_index_container
ランダムアクセスとorderd_uniqueを同時に使用する際に問題が発生します。(長い質問で申し訳ありませんが、例を使用する必要があると思います。)
次に例を示します。ファクトリでN個のオブジェクトを作成し、オブジェクトごとに満たす必要があるとします(この要求は、マルチインデックスの作成時にわかります)。さて、私のアルゴリズム内で、次のクラスに保存する中間結果を取得します。
class intermediate_result
{
private:
std::vector<int> parts; // which parts are produced
int used_time; // how long did it take to produce
ValueType max_value; // how much is it worth
};
オブジェクトが生成されるベクトルparts
descibes(その長さはNであり、辞書式順序で私のcorespデマンドベクトルよりも小さいです!)-そのようなベクトルごとに、used_timeも知っています。さらに、生成されたオブジェクトのこのベクトルの値を取得します。
すべてのオブジェクトを生成できないように、別の制約があります。アルゴリズムintermediate_result
では、データ構造に複数のオブジェクトを格納する必要があります。そして、ここboost::multi_index_container
で使用されます。これは、とのペアが一意parts
をused_time
記述しているためですintermediate_result
(そして、データ構造内で一意である必要があります)がmax_value
、アルゴリズムは常にintermediate_result
最高のを必要とするため、これは考慮しなければならない別のインデックスmax_value
です。
そこで、「parts&used_time-pair」と(異なるオブジェクトが同じ値を持つ可能性があります)にを使用してみましたboost::multi_index_container
。ordered_unique<>
ordered_non_unique<>
max_value
intermediate_result
問題は次のとおりです。どの「parts&used_time-pair」が小さいかを判断するために必要な述語は、std::lexicographical_compare
私のparts
-vectorで使用するため、多くのオブジェクトで非常に低速ですintermediate_result
。しかし、解決策があります。各オブジェクトに対する私の需要はそれほど高くないので、可能な各部分に格納できます。中間結果をそのによって一意にベクトル化しますused_time
。
たとえば、デマンドベクトルがある場合は、可能なパーツベクトル( 2 , 3 , 1)
を格納するデータ構造が必要です。(2+1)*(3+1)*(1+1)=24
そのようなエントリごとに、一意である必要がある異なるused_timesが必要です。(最小の時間を保存するだけでは不十分です。たとえば、追加の制約が次の場合:本番環境で特定の時間を正確に満たすため)
random_access<>
しかし、 -indexと-indexを組み合わせるにはどうすればよいordered_unique<>
ですか?
(Example11はこれについては役に立ちませんでした。)