3

如何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 高度的搜索?(然后在该结果中找到具有最高值的对象?)

4

2 回答 2

0

如果我正确理解您的问题,可能会有更简单的解决方案。只需将您的 MyRects 放入按值排序的 STL-Set 中(需要定义比较运算符或自定义比较函数)。您可以创建一个自定义谓词并使用它来检查给定的 MyRect 是否在某个范围内。然后你使用 STL-Algorithm find_if,并将自定义谓词交给它。如果您确保它以降序遍历序列(例如通过使用 reverse_iterator),它应该返回您正在寻找的 MyRect。

希望这是可以理解的并适用于您的问题。

于 2009-11-30T11:38:04.600 回答
0

我不认为你可以做一个就地限制。
将匹配宽度查询的结果迭代器存储在另一个容器中,并使用该容器通过 remove_if 查找匹配高度。然后使用 max_element 找到最大的。

如果将元素存储为指针,则可以使用相同的 MIC 来存储结果。

于 2009-11-30T11:56:41.533 回答