gpt4 book ai didi

c++ - 如何使用复合键获取 boost::multi_index_container 中第一个键的不同计数

转载 作者:行者123 更新时间:2023-11-30 01:13:53 25 4
gpt4 key购买 nike

boost::multi_index_container 可以构建容器来维护一个或多个具有不同排序和访问语义的索引,如关系数据库。我使用 boost::multi_index_container 和复合键来处理这样的事情:

struct Person {
Person(int id, string name):
m_id(id),
m_name(name)
{
}

int m_id;
string m_name;
};

typedef multi_index_container<
Person,
indexed_by<
ordered_unique<
member<Person, int, &Person::m_id>
>,
ordered_unique<
composite_key<
Person,
member<Person, string, &Person::m_name>,
member<Person, int, &Person::m_id>
>
>
>
> Roster;

int main()
{
Roster r;
r.insert(Person(1, "Tom"));
r.insert(Person(2, "Jack"));
r.insert(Person(3, "Tom"));
r.insert(Person(4, "Leo"));

/* The distinct count of name must be 3, and how to get it? */
}

是否有任何方法可以像关系数据库一样获取 boost::multi_index_container 中非唯一索引键的 distinct 计数?以及如何获取Roster复合键(Person::m_name<)的第一个键(Person::name)的distinct计数, Person::m_id)?谢谢!

编辑:还是只是迭代不同的第一个键的一种方法?这样我们就可以得到第一个键的不同计数。

最佳答案

您可以利用您知道复合索引首先按 m_name 排序的事实。

这意味着您可以在其中运行标准的“唯一”,而无需额外的排序步骤:

    size_t unique_names = boost::size(r.get<by_name_id>() 
| transformed([](Person const& p) -> std::string const& { return p.m_name; })
| uniqued
);

这可能是一个很好的时间/存储权衡。

演示

Live On Coliru

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

struct Person {
Person(int id, std::string name):
m_id(id),
m_name(name)
{
}

int m_id;
std::string m_name;
};

namespace bmi = boost::multi_index;

typedef boost::multi_index_container<
Person,
bmi::indexed_by<
bmi::ordered_unique<
bmi::member<Person, int, &Person::m_id>
>,
bmi::ordered_unique<
bmi::tag<struct by_name_id>,
bmi::composite_key<
Person,
bmi::member<Person, std::string, &Person::m_name>,
bmi::member<Person, int, &Person::m_id>
>
>
>
> Roster;

#include <iostream>
#include <boost/range/algorithm.hpp>
#include <boost/range/adaptors.hpp>

using boost::adaptors::transformed;
using boost::adaptors::uniqued;

int main()
{
Roster r;
r.insert(Person(1, "Tom"));
r.insert(Person(2, "Jack"));
r.insert(Person(3, "Tom"));
r.insert(Person(4, "Leo"));

size_t unique_names = boost::size(r.get<by_name_id>()
| transformed([](Person const& p) -> std::string const& { return p.m_name; })
| uniqued
);

std::cout << unique_names;
}

打印

3

关于c++ - 如何使用复合键获取 boost::multi_index_container 中第一个键的不同计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30975769/

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