Boost.MultiIndexのドキュメントを調べましたが、やりたいことを実行する方法が見つからないようです。それが実行可能かどうかを知りたいです。
おそらく、あなたができる最善のことは、std::map<C, size_t>
あなたと一緒に(またはハッシュマップ)multi_index_container
を維持し、両方を「同期」させておくことです。
マップは、C値をその発生回数(頻度)に関連付けます。これは基本的にC値のヒストグラムです。にを追加するたびに、ヒストグラムの対応する頻度をインクリメントしますElem
。からmulti_index_container
を削除すると、ヒストグラムの対応する頻度が減少します。頻度がゼロに達したら、そのエントリをヒストグラムから削除します。Elem
multi_index_counter
個別のC値のセットを取得するに<key,value>
は、ヒストグラムのペアを反復処理し、key
各ペアの部分を確認するだけです。を使用した場合std::map
、個別のC値はソートされて出力されます。
個別のC値のセットを一度だけ(またはめったに)調べない場合は、上記のアプローチはやり過ぎかもしれません。より簡単なアプローチは、すべてのC値をに挿入してstd::set<C>
から、セットを反復処理して個別のC値を取得することです。
個別のCのセットは、Cの総数よりもはるかに少ないとおっしゃいました。したがって、このアプローチは、Cをaにコピーし、ベクトルをソートしてから実行するstd::set<C>
よりもはるかに少ないスペースを浪費する必要があります。std::vector
std::unique
セットへのコピーとベクトルへのコピー、ソート、実行の時間計算量を比較してみましょうunique
。NをC値の総数、Mを個別のC値の数とします。私の考えでは、セットアプローチはO(N * log(M))の時間計算量を持つ必要があります。Mは小さく、Nが高くてもあまり成長しないため、複雑さは事実上O(N)になります。一方、並べ替えと一意の手法では、時間計算量がO(N * log(N))である必要があります。