Как выполнить equal_range для одного ключа и lower_bound для второго ключа многоиндексного контейнера с комбинированным усилением?
Допустим, у меня есть класс для хранения измерений датчика, и я создал многоиндексный контейнер с комбинированным ключом времени и идентификатором каждого измерения:
namespace {
struct ValueUpdateMsg {
double value;
uint64_t time;
int id;
};
struct time_id {
};
struct id_time {
};
using value_set_t = bmi::multi_index_container<
ValueUpdateMsg,
bmi::indexed_by<
bmi::ordered_unique<
bmi::tag<struct id_time>,
bmi::composite_key<ValueUpdateMsg,
bmi::member<ValueUpdateMsg, decltype(ValueUpdateMsg::id), &ValueUpdateMsg::id>,
bmi::member<ValueUpdateMsg, uint64_t, &ValueUpdateMsg::time>
>
>,
bmi::ordered_unique<
bmi::tag<struct time_id>,
bmi::composite_key<ValueUpdateMsg,
bmi::member<ValueUpdateMsg, uint64_t, &ValueUpdateMsg::time>,
bmi::member<ValueUpdateMsg, decltype(ValueUpdateMsg::id), &ValueUpdateMsg::id>
>
>
>
>;
}
value_set_t container;
container.insert(ValueUpdateMsg{1, 0, 1.0});
container.insert(ValueUpdateMsg{1, 1, 2.0});
container.insert(ValueUpdateMsg{3, 0, 3.0});
container.insert(ValueUpdateMsg{3, 2, 4.0});
container.insert(ValueUpdateMsg{5, 0, 5.0});
container.insert(ValueUpdateMsg{5, 1, 6.0});
Я хотел бы найти узел которого id=2
и время обновления меньше, чем равным 4. Как я могу сделать это в контейнере boost-multi-index?
Я могу выполнить следующее:
auto id2_range = boost::make_iterator_range(container.get<id_time>().equal_range(std::make_tuple(2)));
Чтобы получить диапазон значений которых id == 2
и выполнить линейный (или двоичный) поиск, чтобы найти узел, время которого соответствует запросу. Есть ли лучший способ сделать это в мульти-индексе Boost?
1 ответ
Решение
auto id2_range = boost::make_iterator_range(
container.get<id_time>().lower_bound(2),
container.get<id_time>().upper_bound(std::make_tuple(2,4))
);