Я пытаюсь запросить результаты из контейнера с несколькими индексами, где тип значения представляет собой структуру из трех элементов. Задается первое значение, но второе и третье должны быть больше или меньше параметра запроса.
После поиска я обнаружил, что необходимо реализовать собственное средство извлечения ключей, и некоторые ссылки здесь предлагают то же самое, но я не могу его реализовать:
- boost::multi_index определяемый пользователем экстрактор ключей и составной ключ а>
- 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));
}
У меня есть набор инструкций, что сортировка или перестановка должны игнорироваться.