筆記:boost:: multi_index_container
阿新 • • 發佈:2019-02-14
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; }