我有一个boost :: multi_index容器。有人能告诉我如何根据某个键检索一系列迭代器吗?经过几个小时的搜索后,我认为lower_bound或upper_bound应该可以做到这一点,但我还是没有一个例子。在下面的例子中,我希望获得价格在22到24之间的所有迭代器。非常感谢。
struct order
{
unsigned int id;
unsigned int quantity;
double price;
order(unsigned int id_, unsigned int quantity_, double price_)
:id(id_), quantity(quantity_), price(price_){}
}
typedef multi_index_container<
order,
indexed_by<
ordered_unique<
tag<id>, BOOST_MULTI_INDEX_MEMBER(order, unsigned int, id),
std::greater<unsigned int>>,
ordered_non_unique<
tag<price>,BOOST_MULTI_INDEX_MEMBER(order ,double, price)>
>
> order_multi;
int main()
{
order_multi order_book;
order_book.insert(order(/*id=*/0, /*quantity=*/10, /*price=*/20));
order_book.insert(order(/*id=*/1, /*quantity=*/11, /*price=*/21));
order_book.insert(order(/*id=*/3, /*quantity=*/12, /*price=*/22));
order_book.insert(order(/*id=*/2, /*quantity=*/1, /*price=*/22));
order_book.insert(order(/*id=*/4, /*quantity=*/1, /*price=*/23));
order_book.insert(order(/*id=*/5, /*quantity=*/1, /*price=*/24));
order_book.insert(order(/*id=*/6, /*quantity=*/1, /*price=*/24));
order_book.insert(order(/*id=*/7, /*quantity=*/1, /*price=*/26));
}
答案 0 :(得分:1)
您所关注的范围是[lower_bound(22)
,upper_bound(24)
),即:
auto first=order_book.get<price>().lower_bound(22);
auto last=order_book.get<price>().upper_bound(24);
for(;first!=last;++first)std::cout<<first->id<<" "; // prints 3 2 4 5 6
如果您发现确定何时需要使用lower_
或upper_bound
会让您感到困惑,那么range
member function可能更容易正确(并且速度稍快):
auto range=order_book.get<price>().range(
[](double p){return p>=22;}, // "left" condition
[](double p){return p<=24;}); // "right" condition
for(;range.first!=range.second;++range.first)std::cout<<range.first->id<<" ";
如果您使用C ++ 11并具有lambda函数。您也可以在C ++ 03中使用range
而不使用本机lambda函数,但是您必须求助于Boost.Lambda或者手动编写range
接受的仿函数,这两个选项都有可能太麻烦了。