поиск нескольких индексов с помощью Boost Multi-Index - PullRequest
3 голосов
/ 30 ноября 2009

как мне ограничить поиск в 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);

Но как мне ограничить поиск высоты ядра двумя заданными итераторами? (И после этого найти объект с наибольшим значением в этом результате?)

Ответы [ 2 ]

0 голосов
/ 30 ноября 2009

Я не думаю, что вы можете сделать ограничение на месте.
Сохраните получившиеся итераторы запроса на соответствующую ширину в другом контейнере и используйте этот контейнер, чтобы найти соответствующие высоты с помощью remove_if. Затем используйте max_element, чтобы найти самое большое.

Если вы сохраняете элементы как указатели, вы можете использовать тот же MIC для хранения результатов.

0 голосов
/ 30 ноября 2009

Если я правильно понимаю вашу проблему, возможно, существует более простое решение. Просто поместите ваши MyRects в набор STL, упорядоченный по значению (необходимо определить оператор сравнения или пользовательскую функцию сравнения). Вы можете создать собственный предикат и использовать его, чтобы проверить, находится ли данный MyRect в определенном диапазоне. Затем вы используете алгоритм STL find_if и передаете ему свой предикат. Если вы убедитесь, что он проходит последовательность в порядке убывания (например, с помощью reverse_iterator), он должен вернуть искомый MyRect.

Надеюсь, что это понятно и относится к вашей проблеме.

...