1. 程式人生 > >筆記:boost:: multi_index_container

筆記:boost:: multi_index_container

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;
}