如何通过上一次搜索的结果限制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_width有宽度<=>我可以使用这样的东西:

WidthIterator start_iter = data_object.get<given_width>().begin();
WidthIterator end_iter   = data_object.get<given_width>().upper_bound(input_width);

但是如何通过两个给定的迭代器限制对coresp高度的搜索? (然后在那个结果中找到具有最高值的对象?)

有帮助吗?

解决方案

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

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

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top