c++ - 如何在Boost Multi-index中使equal_range迭代器按不同的索引排序?
问题描述
我在课堂上有一个 boost 多索引容器employee
(取自 boost 官方文档):
typedef multi_index_container<
employee,
indexed_by<
ordered_unique<
tag<id>, BOOST_MULTI_INDEX_MEMBER(employee,int,id)>,
ordered_non_unique<
tag<name>,BOOST_MULTI_INDEX_MEMBER(employee,std::string,name)>,
ordered_non_unique<
tag<age>, BOOST_MULTI_INDEX_MEMBER(employee,int,age)> >
> employee_set;
以下是由 (id, name, age) 打印的容器中的数据示例:
0 Joe 31
1 Robert 27
2 John 40
3 Albert 20
4 John 57
5 John 58
6 John 22
我想要一个按年龄(最后一个字段)排序的名称为 John 的所有项目的迭代器。我尝试了该equal_range
方法:
auto iter1 = boost::make_iterator_range(es.get<name>().equal_range("John"));
它返回一个迭代器,其中包含名称为 John 的所有记录。如何使这个迭代器按第三个索引(即年龄)排序?
输出应该是:
6 John 22
2 John 40
4 John 57
5 John 58
解决方案
好的。这里是复制器Live On Coliru
输出确实
2 "John" 40
4 "John" 57
5 "John" 58
6 "John" 22
现在要按年龄排序(注意单词的选择),您可以使用复合键。所以而不是:
bmi::ordered_non_unique<
bmi::tag<struct name>,
bmi::member<employee, std::string, &employee::name>
>,
利用
bmi::ordered_non_unique<
bmi::tag<struct name_age>,
bmi::composite_key<employee,
bmi::member<employee, std::string, &employee::name>,
bmi::member<employee, int, &employee::age>
>
>,
现在你可以
for (employee const& emp : boost::make_iterator_range(es.get<name_age>().equal_range("John"))) {
std::cout << emp.id << " " << std::quoted(emp.name) << " " << emp.age << "\n";
}
印刷
6 "John" 22
2 "John" 40
4 "John" 57
5 "John" 58
完整样本
#include <boost/multi_index/composite_key.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index_container.hpp>
#include <boost/range/iterator_range.hpp>
namespace bmi = boost::multi_index;
struct employee {
int id;
std::string name;
int age;
};
typedef bmi::multi_index_container<
employee,
bmi::indexed_by<
bmi::ordered_unique<
bmi::tag<struct id>,
bmi::member<employee, int, &employee::id>
>,
bmi::ordered_non_unique<
bmi::tag<struct name>,
bmi::member<employee, std::string, &employee::name>
>,
bmi::ordered_non_unique<
bmi::tag<struct name_age>,
bmi::composite_key<employee,
bmi::member<employee, std::string, &employee::name>,
bmi::member<employee, int, &employee::age>
>
>,
bmi::ordered_non_unique<
bmi::tag<struct age>,
bmi::member<employee, int, &employee::age>
>
> > employee_set;
#include <iostream>
#include <iomanip>
int main() {
employee_set es {
{0, "Joe", 31},
{1, "Robert", 27},
{2, "John", 40},
{3, "Albert", 20},
{4, "John", 57},
{5, "John", 58},
{6, "John", 22},
};
std::cout << "name index:\n";
for (employee const& emp : boost::make_iterator_range(es.get<name>().equal_range("John"))) {
std::cout << emp.id << " " << std::quoted(emp.name) << " " << emp.age << "\n";
}
std::cout << "name_age index:\n";
for (employee const& emp : boost::make_iterator_range(es.get<name_age>().equal_range("John"))) {
std::cout << emp.id << " " << std::quoted(emp.name) << " " << emp.age << "\n";
}
}
印刷
name index:
2 "John" 40
4 "John" 57
5 "John" 58
6 "John" 22
name_age index:
6 "John" 22
2 "John" 40
4 "John" 57
5 "John" 58
推荐阅读
- delphi - Delphi vcl 组件“关于”属性
- vue.js - Vue Cli 3:定义的输出路径
- css - 如何在 scss 中包含仅 safari 风格?
- java - Android - 反序列化时期望一个列表,但得到一个类 java.util.HashMap
- linux - 关于 Lubuntu 16.04 (i386) ICOP board 中的 QT creator
- r - 在选项卡之间切换时保留绘图和输入值
- python - Python Lambda 函数可选变量
- selenium - Selenium 中的继续会话无法 getAttribute()
- xcode - Xcode 服务器机器人错误“触发器以非零状态 2 退出”
- javascript - Cannot read property of 'onOverviewChange' of undefined