Académique Documents
Professionnel Documents
Culture Documents
Boost.MultiIndex en 40
namespace boost
La mayora header-only
Categoras
Algoritmos
Concurrencia
Contenedores
Computacin numrica
Estructuras de datos
Matemticas
Metaprogramacin
Programacin de sistemas
Programacin funcional
Procesamiento de texto
Boost.Asio
Boost.Bind
Currificacin de funciones
Boost.Filesystem
Boost.Function
Boost.Graph
Boost.Interprocess
Boost.Random
Generadores y distribuciones
Boost.Regex
Expresiones regulares
Boost.SmartPtr
shared_ptr, scoped_ptr
Boost.Thread
Multithreading portable
Boost.Asio
Boost.Bind
Boost.Filesystem
Boost.Function
Boost.Graph
Boost.Interprocess
Boost.Random
Boost.Regex
Boost.SmartPtr
Boost.Thread
Boost.Asio
Boost.Bind
Boost.Filesystem
Boost.Function
Boost.Graph
Boost.Interprocess
Boost.Random
Boost.Regex
Boost.SmartPtr
Boost.Thread
Boost.MultiIndex
Boost.MultiIndex
Contenedor multindice
tabla relacional
Interfaz de acceso
ndice
Header-only
Ejemplos
Notacin de ajedrez
Estequiometra
Expresiones regulares
Bienvenido a la universidad
struct employee
{
int
id;
std::string name;
int
department_id;
unsigned int salary;
};
bool operator<(const employee& x,const employee& y){return x.id<y.id;}
typedef std::set<employee> payroll;
enum {logic=0,physics=1,philosophy=2};
int main()
{
payroll p{
{0,"Goedel Kurt",logic,20000},
{1,"Russell Bernie",philosophy,25000},
{2,"Frege Gottlob",logic,18000},
{3,"Einstein Al",physics,21000},
{4,"Church Alonzo",logic,25000}
};
}
Goedel Kurt
Russell Bernie
Frege Gottlob
Einstein Al
Church Alonzo
logic
philosophy
logic
physics
logic
20000
25000
18000
21000
25000
Church Alonzo
Einstein Al
Frege Gottlob
Goedel Kurt
Russell Bernie
logic
physics
logic
logic
philosophy
25000
21000
18000
20000
25000
Goedel Kurt
Frege Gottlob
Church Alonzo
Einstein Al
Russell Bernie
logic
logic
logic
physics
philosophy
20000
18000
25000
21000
25000
Mejoremos la eficiencia
Solucin pedestre #1
typedef std::set<employee>
payroll;
typedef std::set<employee,less_by_name>
payroll_by_name;
typedef std::multiset<employee,less_by_department_id> payroll_by_department_id;
Solucin pedestre #2
typedef std::set<employee>
payroll;
typedef std::set<const employee*,less_by_name>
payroll_by_name;
typedef std::multiset<const employee*,less_by_department_id> payroll_by_department_id;
insert({0,"Goedel Kurt",logic,20000});
insert({5,"Goedel Kurt",physics,18000});
Buena suerte!
Boost.MultiIndex al rescate
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/member.hpp>
using namespace boost::multi_index;
typedef multi_index_container<
employee,
indexed_by<
ordered_unique<
member<employee,int,&employee::id>>,
ordered_unique<
member<employee,std::string,&employee::name>>,
ordered_non_unique< member<employee,int,&employee::department_id>>
>
> payroll;
Con tags
Lo peor ya ha pasado
int main()
{
payroll p{
{0,"Goedel Kurt",logic,20000},
{1,"Russell Bernie",philosophy,25000},
{2,"Frege Gottlob",logic,18000},
{3,"Einstein Al",physics,21000},
{4,"Church Alonzo",logic,25000}
};
p.insert({5,"Goedel Kurt",physics,18000}); // fails, Kurt is already in
}
void list_by_name(const payroll& p)
{
for(const auto& x:p.get<by_name>())std::cout<<x<<std::endl;
}
void suppress_department(payroll& p,int department_id)
{
p.get<by_dep_id>().erase(department_id);
}
Extractores de clave
struct element
{
int
value;
std::string id()const;
#include <boost/multi_index/member.hpp>
member<element,int,&element::value>
#include <boost/multi_index/mem_fun.hpp>
const_mem_fun<element,std::string,&element::id>
};
double property(const element& x);
#include <boost/multi_index/global_fun.hpp>
global_fun<const element&,double,property>
#include <boost/multi_index/composite_key.hpp>
composite_key<
element,
member<element,int,&element::value>,
const_mem_fun<element,std::string,&element::id>
>
Tipos de ndices
#include <boost/multi_index/ordered_index.hpp>
ordered_unique
<tag,key extractor,comparison predicate>
ordered_non_unique<tag,key extractor,comparison predicate>
#include <boost/multi_index/hashed_index.hpp>
hashed_unique
<tag,key extractor,hash function,equality predicate>
hashed_non_unique<tag,key extractor,hash function,equality predicate>
#include <boost/multi_index/sequenced_index.hpp>
sequenced<tag>
#include <boost/multi_index/random_access_index.hpp>
random_access<tag>
Modificacin de elementos
Llaves compuestas
Llaves heterogneas
Contenedores de punteros
Serializacin
Boost.MultiIndex y Boost.Interprocess
Boost
boost.org
Boost.MultiIndex
boost.org/libs/multi_index
Usuarios
lists.boost.org/boost-users
Desarrolladores
lists.boost.org/Archives/boost
isocpp.org
reddit CPP
reddit.com/r/cpp
Channel 9
channel9.msdn.com/tags/c++
Stack Overflow
stackoverflow.com
Coliru
stacked-crooked.com
Boost en 5 minutos
Boost.MultiIndex en 40
Gracias