次を満たすデータ構造が必要です。
- 任意の数の要素を格納します。各要素は 10 個の数値メトリックによって記述されます
log n
メトリックのいずれかによる要素の高速 () 検索を可能にしますlog n
新しい要素の高速 () 挿入が可能- 素早い (
log n
) 要素の削除が可能
そして、要素の構築に費用がかかると仮定しましょう。
次のプランを思いついた
- すべての要素を DATA というベクトルに格納します。
std::sets
10 のメトリックごとに 1 つずつ、 10 を使用します。それぞれstd:set
軽量で、 vector へのインデックスである整数のみが含まれますDATA
。比較演算子は、DATA 内の適切な要素を「検索」し、適切なメトリックを選択します。
template< int C >
struct Cmp
{
bool operator() (int const a, int const b)
{
return ( DATA[a].coords[C] != DATA[b].coords[C] )
? ( DATA[a].coords[C] < DATA[b].coords[C] )
: ( a < b );
}
};
要素が変更されたり、ベクターから削除されたりすることはありません。新しい要素が DATA にプッシュ バックされ、そのインデックス ( DATA.size()-1
) がセット ( ) に挿入されますset<int, Cmp<..> >
。要素を削除するには、削除されたことを示すフラグを要素に設定し (実際にはDATA
ベクトルから削除せずに)、10 個すべての std::set から要素インデックスを削除します。
DATA
これは、グローバル変数である限り正常に機能します。(また、テンプレート化された構造体 Cmp をグローバル変数に依存させることで、型システムを悪用しています。)
ただし、DATA
ベクトルと std::set の ( ) をクラス内に囲み、それらでset<int, Cmp<...> >
「インデックス」することはできませんでした。まず、外部クラス内で定義された比較演算子 Cmp は、外部クラスのフィールドにアクセスできません (したがって、DATA を評価できません)。Cmp は std::set によって構築されており、std::set は引数を持たないコンストラクターとの比較演算子を想定しているため、ベクトルを Cmp コンストラクターに渡すこともできません。DATA
std::sets
私は C++ 型システムに反対し、型システムが意図的に私を妨げている何かを達成しようとしているような気がします。(実行時にのみ構築される変数に std::set を依存させようとしています。)そして、型システムが私のやり方を好まない理由は理解していますが、これは正当な使用例だと思います。
std::set/red-black ツリーの再実装を提供せずに、上記のデータ構造/クラスを実装する方法はありますか? 私がまだ考えていないトリックがあるといいのですが。(そうです、boost には何かがあることは知っていますが、標準ライブラリに固執したいと思います。)