如何根据上一次搜索的结果限制boost::multi_index中的搜索?举个例子:假设我有一个rectangle类,它的内部值如下:
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);但是我如何限制两个给定迭代器对coresp高度的搜索呢?(然后查找该结果中具有最高值的对象?)
发布于 2009-11-30 19:56:42
我不认为你可以做一个原地限制。
将匹配宽度查询的结果迭代器存储在另一个容器中,并使用该容器通过remove_if查找匹配的高度。然后使用max_element查找最大的。
如果将元素存储为指针,则可以使用相同的MIC来存储结果。
发布于 2009-11-30 19:38:05
如果我没弄错你的问题,可能会有一个更简单的解决方案。只需将您的MyRects放入按值排序的STL集(需要定义比较运算符或自定义比较函数)。您可以创建一个自定义谓词,并使用该谓词检查给定的MyRect是否在某个范围内。然后使用STL-Algorithm find_if,并将自定义谓词传递给它。如果您确保它以降序遍历序列(例如,通过使用reverse_iterator),它应该返回您正在查找的MyRect。
希望这是可以理解的,并适用于您的问题。
https://stackoverflow.com/questions/1818821
复制相似问题