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