boost::multi_index_container 作用:创建一种提供索引的数据结构,快速查询。
ordered_unique,索引。唯一值
composite_key, 排序的key,
composite_key_comare,排序方式,传入自定义排序方法。
#include <iostream>
#include <string>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/composite_key.hpp>
#include <boost/tuple/tuple.hpp>
#include <boost/tuple/tuple_comparison.hpp>
struct Operation_type{
int time;
friend bool operator < (const Operation_type &op1, const Operation_type &op2){
return op1.time < op2.time;
}
};
typedef struct {
std::string name;
unsigned int age;
unsigned int heigth;
unsigned int num;
Operation_type op;
}student;
//自定义排序
struct CmpByKeyLength {
bool operator()(const Operation_type& k1, const Operation_type& k2) const {
return k1.time < k2.time;
}
};
struct by_num{};
struct by_name{};
struct by_age{};
struct by_stu_op_time{};
using namespace boost::multi_index;
typedef
boost::multi_index_container<
student,
indexed_by<
//ordered_unique, 索引,唯一
ordered_unique<tag< by_num >,
composite_key<student, member<student, Operation_type, &student::op>>,
composite_key_compare<CmpByKeyLength> >,
ordered_non_unique<tag< by_age >, member<student, unsigned int, &student::age>>,
ordered_non_unique<tag< by_name >, member<student, std::string, &student::name>>,
ordered_non_unique<tag< by_stu_op_time >, member<student, Operation_type, &student::op>>
>
> StuContainer;
void insert(StuContainer &con){
student st1 = {"alice", 18, 170, 1, {1}};
student st2 = {"alice", 19, 170, 2, {2}};
student st3 = {"boy", 20, 171, 3, {3}};
student st4 = {"bush", 21, 171, 4, {5}};
student st5 = {"gay", 22, 172, 5, {10}};
student st6 = {"send", 23, 174, 7, {11}};
con.insert(st2);
con.insert(st3);
con.insert(st6);
con.insert(st1);
con.insert(st4);
con.insert(st5);
}
int main() {
StuContainer con;
insert(con);
StuContainer::index<by_num>::type &indexofName = con.get<by_num>();
auto itr = indexofName.begin();
auto end = indexofName.end();
while(itr != end){
std::cout << itr->op.time << std::endl;
itr++;
}
std::cout << "Hello, World!" << std::endl;
return 0;
}