【发布时间】:2018-05-29 04:35:14
【问题描述】:
我正在尝试从值类型是三个元素的结构的多索引容器中查询结果。第一个值是给定的,但第二个和第三个必须大于或小于查询参数。
四处搜索后,我发现必须实现一个自定义密钥提取器,这里的一些链接建议相同,但我无法实现它:
- boost::multi_index user-defined key extractor and composite key
- https://www.boost.org/doc/libs/1_62_0/libs/multi_index/test/test_composite_key.cpp
谁能帮我让它工作?
下面是我的结构和多索引实现:
#define RANKFILTERVIEW 0
struct TPQ {
int UID;
int Value;
int Rank;
TPQ():UID(0),Value(0),Rank(0)
{ }
TPQ(int _T, int _V, int _R):UID(_T),Value(_V),Rank(_R)
{ }
};
typedef bip::allocator<
TPQ,bip::managed_shared_memory::segment_manager
> shared_struct_allocator;
typedef bmi::multi_index_container<
TPQ,
bmi::indexed_by<
bmi::ordered_unique<bmi::tag<struct Composite>,
bmi::composite_key<TPQ,
bmi::member<TPQ, int,&TPQ::UID>,
bmi::member<TPQ, int,&TPQ::Value>,
bmi::member<TPQ, int,&TPQ::Rank>
> >
>,
shared_struct_allocator
> Rank_Set;
typedef nth_index<Rank_Set, RANKFILTERVIEW>::type Rank_view;
int main()
{
bip::managed_shared_memory segment(bip::open_only,"RANKSOTRE");
int UID =52478;
std::pair<Rank_Set*, std::size_t> RankOrderRecord=segment.find<Rank_Set>("RANKDATARECORD");
/// Here I want the result as stated below.
auto range = RankOrderRecord.first->get<Composite>().equal_range(boost::make_tuple(UID,_2>500,_3>5));
}
我有一组指令可以忽略排序或重新排列。
【问题讨论】:
-
"我有一组指令,可以忽略排序或重新排列。" - 你是什么意思?你的意思是,你应该实际使用索引...?
标签: c++ boost boost-multi-index