如何通过之前的搜索结果限制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);
但是如何通过两个给定的迭代器限制对coresp高度的搜索? (然后在那个结果中找到具有最高值的对象?)
答案 0 :(得分:0)
如果我正确理解您的问题,可能会有一个更简单的解决方案。只需将MyRects放入按值排序的STL-Set(需要定义比较运算符或自定义比较函数)。您可以创建自定义谓词,并使用该谓词检查给定的MyRect是否在特定范围内。然后使用STL算法find_if
,并将其交给自定义谓词。如果确保它以递减顺序遍历序列(例如,通过使用reverse_iterator),它应该返回您正在寻找的MyRect。
希望这是可以理解的并适用于您的问题。
答案 1 :(得分:0)
我认为你不能做到适当的限制 将匹配宽度查询的结果迭代器存储在另一个容器中,并使用该容器通过remove_if查找匹配的高度。然后使用max_element找到最大的。
如果将元素存储为指针,则可以使用相同的MIC来存储结果。