C++ Boost MultiIndex

Da Andreabont's Wiki.

MultiIndex è una libreria delle BOOST che permette di costruire dei container indicizzati su più campi in contemporanea. La libreria fornisce diversi tipi di indice, in modo da simulare tutte le interfacce classiche dei contenitori.

Esempio con accesso dati ordinato

Intestazione

Prima di tutto gli include di rito e la definizione del tipo composito da utilizzare

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

// Struttura dell'elemento che verrà inserito nel container
struct multi {

	int num;
	std::string str;

	multi(int num_,std::string str_):num(num_),str(str_){}

};

// Tag per l'accesso agli indici dell'elemento
struct num{};
struct str{};

Definizione del container

Ora possiamo definire nel main il nostro container

boost::multi_index::multi_index_container<
	multi,
	boost::multi_index::indexed_by<
		boost::multi_index::ordered_unique<boost::multi_index::tag<num>,  BOOST_MULTI_INDEX_MEMBER(multi,int,num)>,
                boost::multi_index::ordered_unique<boost::multi_index::tag<str>,  BOOST_MULTI_INDEX_MEMBER(multi,std::string,str)>
	>
> multi_container;

Inserimento dati nel container

Ora possiamo inserire i dati nel container

multi_container.insert({0,"c"});
multi_container.insert({1,"b"});
multi_container.insert({2,"a"});

Accesso al container tramite num

auto &num_iter = boost::multi_index::get<num>(multi_container);
for (auto it = num_iter.begin(); it != num_iter.end(); ++it) {
	std::cout << it->num << " " << it->str << std::endl;
}

Che produce come output:

0 c
1 b
2 a

Accesso al container tramite str

auto &str_iter = boost::multi_index::get<str>(multi_container);
for (auto it = str_iter.begin(); it != str_iter.end(); ++it) {
        std::cout << it->num << " " << it->str << std::endl;
}

Che produce come output:

2 a
1 b
0 c

Accesso tramite foreach del C++11

for(auto i : boost::multi_index::get<num>(multi_container)) {
        std::cout << i.num << " " << i.str << std::endl;
}