首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对复合键控boost多索引容器的一个键执行equal_range,对第二个键执行lower_bound?

如何对复合键控boost多索引容器的一个键执行equal_range,对第二个键执行lower_bound?
EN

Stack Overflow用户
提问于 2019-01-24 10:53:43
回答 1查看 96关注 0票数 2

假设我有一个用来保存传感器测量值的类,我创建了一个boost多索引容器,其中包含时间和每个测量值的id的组合键:

代码语言:javascript
复制
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容器中做到这一点?

我可以执行以下操作:

代码语言:javascript
复制
auto id2_range = boost::make_iterator_range(container.get<id_time>().equal_range(std::make_tuple(2)));

以获取其id == 2的值范围,并执行线性(或二进制)搜索以查找其时间与查询匹配的节点。在boost多指数中有没有更好的方法呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-28 16:36:37

代码语言:javascript
复制
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))
);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54338727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档