boost多個關鍵字索引multi_index_container

根據不同的索引排序結構體。其中tag的意思是指定一個標記,如果不指定的話默認是從0開始,以下例子展示了這兩種情況

代碼:

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

using namespace boost;
using namespace boost::multi_index;
using namespace std;
struct Person{
  int id;
  int age;
  int height;
  string name;

  Person(int id_,int age_,int height_,std::string name_):
    id(id_),
    age(age_),
    height(height_),
    name(name_)
    {}
};

std::ostream& operator<<(std::ostream& os,const Person& ps)
{
  os<<ps.id<<" "<<ps.age<<" "<<ps.height<<" "<<ps.name<<" "<<std::endl;
  return os;
}

typedef multi_index_container<
  Person,
  indexed_by<
    ordered_unique<member<Person, int, &Person::id> >,
    ordered_non_unique<member<Person, int, &Person::age> >,
    ordered_non_unique<member<Person, int, &Person::height> >,
    ordered_non_unique<member<Person, string, &Person::name> > 
> >PersonContainer;

typedef PersonContainer::nth_index<0>::type IdIndex;
typedef PersonContainer::nth_index<1>::type AgeIndex;
typedef PersonContainer::nth_index<2>::type HeightIndex;
typedef PersonContainer::nth_index<3>::type NameIndex;




struct person_id{};
struct person_age{};
struct person_height{};
struct person_name{};

typedef multi_index_container<
  Person,indexed_by<
    ordered_unique< tag<person_id>,member<Person, int, &Person::id> >,
    ordered_non_unique< tag<person_age>,member<Person, int, &Person::age> >,
    ordered_non_unique< tag<person_height>,member<Person, int, &Person::height> >,
    ordered_non_unique<tag<person_name>,member<Person, string, &Person::name> >
> >PersonContainerTag; 

int main(){
  PersonContainer con;
  con.insert(Person(2,31,170,"aliu"));
  con.insert(Person(1,27,164,"dliu"));
  con.insert(Person(0,55,182,"cliu"));
  con.insert(Person(3,51,142,"bliu"));


  IdIndex& ids = con.get<0>();
  copy(ids.begin(),ids.end(), ostream_iterator<Person>(cout));
  cout << endl;

  AgeIndex& ages = con.get<1>();
  copy(ages.begin(), ages.end(), ostream_iterator<Person>(cout));
  cout << endl;

  HeightIndex& heights = con.get<2>();
  copy(heights.begin(), heights.end(), ostream_iterator<Person>(cout));
  cout << endl;

  NameIndex& names = con.get<3>();
  copy(names.begin(), names.end(), ostream_iterator<Person>(cout));
  cout << endl;



  PersonContainerTag con_tag;
  con_tag.insert(Person(2,31,170,"aliu"));
  con_tag.insert(Person(1,27,164,"dliu"));
  con_tag.insert(Person(0,55,182,"cliu"));
  con_tag.insert(Person(3,51,142,"bliu"));

  auto& ids_tag = con_tag.get<person_id>();
  copy(ids_tag.begin(),ids_tag.end(), ostream_iterator<Person>(cout));
  cout << endl;

  auto& ages_tag = con_tag.get<person_age>();
  copy(ages_tag.begin(), ages_tag.end(), ostream_iterator<Person>(cout));
  cout << endl;

  auto& heights_tag = con_tag.get<person_height>();
  copy(heights_tag.begin(), heights_tag.end(), ostream_iterator<Person>(cout));
  cout << endl;

  auto& names_tag = con_tag.get<person_name>();
  copy(names_tag.begin(), names_tag.end(), ostream_iterator<Person>(cout));
  cout << endl;

  return 0;
}

結果:

0 55 182 cliu 
1 27 164 dliu 
2 31 170 aliu 
3 51 142 bliu 

1 27 164 dliu 
2 31 170 aliu 
3 51 142 bliu 
0 55 182 cliu 

3 51 142 bliu 
1 27 164 dliu 
2 31 170 aliu 
0 55 182 cliu 

2 31 170 aliu 
3 51 142 bliu 
0 55 182 cliu 
1 27 164 dliu 

0 55 182 cliu 
1 27 164 dliu 
2 31 170 aliu 
3 51 142 bliu 

1 27 164 dliu 
2 31 170 aliu 
3 51 142 bliu 
0 55 182 cliu 

3 51 142 bliu 
1 27 164 dliu 
2 31 170 aliu 
0 55 182 cliu 

2 31 170 aliu 
3 51 142 bliu 
0 55 182 cliu 
1 27 164 dliu



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章