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>
>
>, // ...
>
如您所见,有点(x,y)(ByP
)的索引。
现在我使用下一个功能:
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&lt; x&lt; max.x&amp;&amp; min.y&lt; y&lt; max.y)。它正在发挥作用。
但是,你怎么看,容器返回了更多的点数,这是我预期的,我必须再次过滤它们。 我认为,表演是错误的。
我想,我必须自己定义比较器以获得正确的分数。但这种比较方式不适合boost :: multi_index_container:
struct Compare
{
bool operator() (const Point &p, const Point &q) const
{ return (p.x < q.x) && (p.y < q.y); }
};
(第一条评论@RichardHodges)
答案 0 :(得分:0)
首先,比较器对我来说似乎不对(看起来它并没有根据需要定义完全弱的排序)。
其次,复合键上的键类型在逻辑上是组成部分的元组。默认比较实现由boost提供(作为词典成员比较¹)。
这更有可能成为你想要的。如果必须以某种方式覆盖它,请使用: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 :: tuple也定义了相同的运算符