поиск нескольких индексов с помощью Boost Multi-Index
-
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.
Надеюсь, что это понятно и относится к вашей проблеме.