2016-04-14 12 views
0
typedef boost::multi_index_container 
< Record, 
    indexed_by 
    < ordered_non_unique 
    < tag<ByP>, 
     composite_key < Record, 
         const_mem_fun<Record, double, &Record::hit_x>, 
         const_mem_fun<Record, double, &Record::hit_y> 
    > 
    >, // ... 
> 

ご覧のとおり、Point(x、y)(ByP)によるインデックスがあります。 は、今は次の関数を使用しています:boost :: multi_index_container:composite_key(x、y)を使用して長方形の検索をサポートする方法は?

size_t adjacencyRectPoints (std::list<Record> &range, const Point &min, const Point &max) 
{ 
    MultiIndexMoves::index<ByP>::type &index = store_.get<ByP>();  
    /* Range searching, i.e.the lookup of all elements in a given interval */ 
    auto itFirstLower = index.lower_bound (boost::tuple<double, double> (min)); 
    auto itFirstUpper = index.upper_bound (boost::tuple<double, double> (max)); 

    size_t count = 0U; 
    for (auto it = itFirstLower; it != itFirstUpper; ++it) 
    { 
    if ((min.x <= it->hit.x && min.y <= it->hit.y) 
     && (max.x >= it->hit.x && max.y >= it->hit.y)) 
    { 
     range.push_back (*it); 
     ++count; 
    } 
    } 
    return count; 
} 

この関数は、矩形のすべての点を返す:(min.x max.x & & min.y < < X < Y < max.y)。それは働いている。

しかし、コンテナは予想よりも多くのポイントを返し、もう一度それらをフィルタリングする必要があります。 私はその演技が間違っていると思います。


コンパレータを自分で定義して、正しい点だけを取得しなければならないと思っていました。

struct Compare 
{ 
    bool operator() (const Point &p, const Point &q) const 
    { return (p.x < q.x) && (p.y < q.y); } 
}; 

(最初のコメント@RichardHodges)

+2

と同じ演算子を定義します。それは可逆的ではありません。 xの値が等しく、yの値が異なる場合、他のキーと同じかそれ以上のキーは取得されません。 –

+0

"compare_resultのキー間でAND演算子を取得することは非常に重要です。" - その場合、私は何とかこれがマルチインデックスの仕組みを見失ってしまいます。 – VolkerK

+0

@ VolkerK、コンテナはxとyで独立して検索し、それから交差します。つまり、各キーコンパレータがtrueを返したことを意味します。 –

答えて

0

はまず、コンパレータは、それが定義されないように、それは見ていません(私には間違っているようだ。しかし、比較の方法は、ブースト:: multi_index_containerに適合していません必要に応じて全体的に弱い順序)。

第2に、コンポジットキーのキータイプは、論理的に構成部分のタプルです。デフォルトの比較の実装は、ブーストによって提供されます(辞書的なメンバーシップの比較として)。

これは、あなたが望むものになる可能性がはるかに高いです。あなたはそれにいくつかの方法で、使用をオーバーライドする必要がある場合:http://www.boost.org/doc/libs/1_60_0/libs/multi_index/doc/reference/key_extraction.html#composite_key_compare


<boost/tuple/tuple_comparison.hpp>を¹とC++ 11ののstd ::タプルはまた、コンパレータが間違っている

+0

私はドキュメントを読んだが、理解していない、どのようにコンテナ内の領域の検索を整理する。デフォルトの順序はそれに合っていませんが、私のコンパレータが間違っている場合は、このコードをどこに統合するのが正しいか分かりません。 –

+2

あなたの質問がhttp://stackoverflow.com/questions/35778119/boost-multi-index-composite-key-for-multiple-column-indexesに関連していると思われます –

+1

@KirillGolikov可能ならばお手伝いしますあなたの質問を「地域検索」という意味の例で更新してください(部分的なキーで 'equal_range'を参照していますか?いくつかの回答があります)(https://stackoverflow.com/search?q=ユーザー%3A85371 + composite_key)。)。あなたがそれをする必要があると思うよりも、何を達成したいのかを説明してください。 – sehe

関連する問題