Boost Multi-Indexで複数のインデックスを検索
-
10-07-2019 - |
質問
前の検索の結果によって boost :: multi_index
の検索を制限するにはどうすればよいですか?
例として、次のような内部値を持つ矩形クラスがあるとします:
class MyRect
{
public:
int width;
int height;
double value;
}
そして、" input_rectangle
のようなクエリに答えるために、そのようなオブジェクトのデータ構造が必要です-どのオブジェクト MyRect
がその長方形に含まれ、最高値を持っていますか? "
次のように「multi_index」を使用できます:
struct given_value{};
struct given_width{};
struct given_height{};
typedef multi_index_container<MyRect,
indexed_by<
ordered_non_unique< tag<given_value>,
member<MyRect, double, &MyRect::value>,
ordered_non_unique< tag<given_width>,
member<MyRect, int, &MyRect::width>,
ordered_non_unique< tag<given_height>,
member<MyRect, int, &MyRect::height>, >
>
> MyDataStructure;
typedef MyDataStructure::index<given_width>::type MyDataStructureGivenWidth;
typedef MyDataStructureGivenWidth::iterator WidthIterator;
input_rectangle
の幅が input_width
の場合、次のようなものを使用できます。
WidthIterator start_iter = data_object.get<given_width>().begin();
WidthIterator end_iter = data_object.get<given_width>().upper_bound(input_width);
しかし、指定された2つのイテレータによってcorespの高さの検索を制限するにはどうすればよいですか? (そして、その結果で最高値を持つオブジェクトを見つけますか?)
解決
インプレースの制限を行うことはできないと思います。
一致する幅のクエリの結果のイテレータを別のコンテナに保存し、そのコンテナを使用してremove_ifで一致する高さを見つけます。次に、max_elementを使用して最大のものを見つけます。
要素をポインターとして保存する場合、同じMICを使用して結果を保存できます。
他のヒント
問題を正しく理解している場合、より簡単な解決策があるかもしれません。 MyRectsを値で順序付けられたSTLセットに入れるだけです(比較演算子またはカスタム比較関数を定義する必要があります)。特定のMyRectが特定の範囲内にあるかどうかを確認するカスタム述語を作成して使用できます。次に、STL-Algorithm find_if
を使用し、カスタム述語を渡します。 (たとえばreverse_iteratorを使用して)降順でシーケンスをトラバースすることを確認すると、探しているMyRectが返されます。
理解可能で問題に当てはまることを願っています。