gpt4 book ai didi

c++ - boost::multi_index_container 复合键中的 equal_range 与比较运算符

转载 作者:行者123 更新时间:2023-11-30 05:00:47 25 4
gpt4 key购买 nike

我正在尝试从一个多索引容器中查询结果,其中的值类型是一个包含三个元素的结构。第一个值已给出,但第二个和第三个值必须大于或小于查询参数。

四处搜索后,我发现必须实现一个自定义 key 提取器,这里的一些链接建议相同,但我无法实现它:

谁能帮我让它工作?

下面是我的结构和多索引实现:

#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));

}

我有一套指令,排序或重新排列应被忽略。

最佳答案

你几乎明白了。实际上,为了索引,您可以通过部分 键进行查询。由于字段是常规整数类型,因此很容易得出一个好的下限和上限:

auto range = boost::make_iterator_range(
view.lower_bound(boost::make_tuple(UID, 501, 6)),
view.lower_bound(boost::make_tuple(UID+1)));

这是一个完整的演示:

Live On Coliru

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/composite_key.hpp>
#include <boost/multi_index/ordered_index.hpp>

#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/managed_mapped_file.hpp> // for Coliru

#include <boost/range/iterator_range.hpp>

#include <iostream>

namespace bmi = boost::multi_index;
namespace bip = boost::interprocess;

struct TPQ {
int UID = 0;
int Value = 0;
int Rank = 0;

TPQ() = default;
TPQ(int _T, int _V, int _R) : UID(_T), Value(_V), Rank(_R) {}
};

static inline std::ostream& operator<<(std::ostream& os, TPQ const& tpq) {
return os << "{ UID: " << tpq.UID
<< ", Value: " << tpq.Value
<< ", Rank: " << tpq.Rank << "}";
}

using shared_struct_allocator = bip::allocator<TPQ, bip::managed_mapped_file::segment_manager>;

using Rank_Set = bmi::multi_index_container<
TPQ,
bmi::indexed_by<
bmi::ordered_unique<
bmi::tag<struct RankFilterView>,
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>;

using Rank_view = bmi::index<Rank_Set, RankFilterView>::type;

int main() {
bip::managed_mapped_file segment(bip::open_or_create, "RANKSOTRE", 10*1024);
auto& table = *segment.find_or_construct<Rank_Set>("RANKDATARECORD")(segment.get_segment_manager());

table.insert({
{52478, 501, 6}, // Match!
{52478, 500, 6}, // - Value too small
{52479, 0, 0}, // - UID too high
{52478, 502, 6}, // Match!
{52478, 502, 7}, // Match!
{52478, 501, 5}, // - Rank too small
{52477, 502, 7}, // - UID too small
{52478, 999, 9}, // Match!
});

int UID = 52478;
Rank_view& view = table.get<RankFilterView>();

auto range = boost::make_iterator_range(
view.lower_bound(boost::make_tuple(UID, 501, 6)),
view.upper_bound(UID));

for (TPQ const& tpq : range) {
std::cout << tpq << "\n";
}

}

这只会按预期打印:

{ UID: 52478, Value: 501, Rank: 6}
{ UID: 52478, Value: 502, Rank: 6}
{ UID: 52478, Value: 502, Rank: 7}
{ UID: 52478, Value: 999, Rank: 9}

关于c++ - boost::multi_index_container 复合键中的 equal_range 与比较运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50576367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com