Как выполнить equal_range для одного ключа и lower_bound для второго ключа многоиндексного контейнера с комбинированным усилением? - PullRequest
0 голосов
/ 24 января 2019

Допустим, у меня есть класс для хранения измерений датчика, и я создал многоиндексный контейнер повышения с составным ключом времени и идентификатором каждого измерения:

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 Ответ

0 голосов
/ 28 января 2019
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))
);
...