поиск нескольких индексов с помощью Boost Multi-Index

StackOverflow https://stackoverflow.com/questions/1818821

  •  10-07-2019
  •  | 
  •  

Вопрос

как мне ограничить поиск в boost :: multi_index результатом предыдущего поиска? Как пример: предположим, у меня есть класс прямоугольника с внутренним значением, подобным этому:

    class MyRect
    {
    public:
        int    width;  
        int    height; 

        double value;
    }

и мне нужна структура данных такого объекта для ответа на запросы типа " с учетом input_rectangle - какой объект MyRect содержится в этом прямоугольнике и имеет наибольшее значение? & Quot;

Я мог бы использовать '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);

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

Это было полезно?

Решение

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top