2010-04-15 20 views
6

Estoy programando una simulación basada en agentes y he decidido que el MultiIndex de Boost es probablemente el contenedor más eficiente para mis agentes. No soy un programador profesional, y mi experiencia es muy irregular. Tengo dos preguntas:Boost MultiIndex - objetos o punteros (¿y cómo usarlos?)?

  1. ¿Es mejor tener el contenedor contiene los agentes (de clase Host) a sí mismos, o es más eficiente para el envase para guardar Host *? Los hosts a veces se eliminarán de la memoria (ese es mi plan, de todas formas ... necesito leer en new y delete). Las variables privadas de Hosts se actualizarán ocasionalmente, lo que espero hacer a través de la función modify en MultiIndex. No habrá otras copias de Hosts en la simulación, es decir, no se usarán en ningún otro contenedor.
  2. Si uso punteros para Hosts, ¿cómo configuro la extracción de claves correctamente? Mi código a continuación no compila.
// main.cpp - ATTEMPTED POINTER VERSION 
... 
#include <boost/multi_index_container.hpp> 
#include <boost/multi_index/hashed_index.hpp> 
#include <boost/multi_index/member.hpp> 
#include <boost/multi_index/ordered_index.hpp> 
#include <boost/multi_index/mem_fun.hpp> 
#include <boost/tokenizer.hpp> 

typedef multi_index_container< 
    Host *, 
    indexed_by< 
    // hash by Host::id 
    hashed_unique< BOOST_MULTI_INDEX_MEM_FUN(Host,int,Host::getID) > // arg errors here 
    > // end indexed_by 
    > HostContainer; 

... 
int main() { 

    ... 
    HostContainer testHosts; 
    Host * newHostPtr; 
    newHostPtr = new Host(t, DOB, idCtr, 0, currentEvents); 
    testHosts.insert(newHostPtr); 
    ... 
} 

No puedo encontrar un ejemplo precisamente análoga en la documentación Boost, y mi conocimiento de la sintaxis de C++ es todavía muy débil. El código parece funcionar cuando reemplazo todas las referencias de puntero con los objetos de clase.


lo mejor que pueda leerlo, el refuerzo documentation (ver tabla resumen en la parte inferior) implica que debería ser capaz de utilizar las funciones miembro con elementos de puntero.

Respuesta

7

Si Host contiene muchos datos, puede usar shared_ptr para evitar copiar. Se podría utilizar MultiIndex con shared_ptr en ella:

#include <boost/multi_index_container.hpp> 
#include <boost/multi_index/member.hpp> 
#include <boost/multi_index/mem_fun.hpp> 
#include <boost/multi_index/hashed_index.hpp> 
#include <boost/shared_ptr.hpp> 

using namespace boost::multi_index; 

struct Host 
{ 
    int get_id() const { return id; } 
private: 
    int id; 
    // more members here 
}; 

typedef multi_index_container< 
    boost::shared_ptr<Host>, // use pointer instead of real Host 
    indexed_by< 
    // hash using function Host::get_id 
    hashed_unique< const_mem_fun<Host, int, &Host::get_id> > 
    > // end indexed_by 
    > HostContainer; 

Posteriormente, se podría utilizar la siguiente manera:

int main() 
{ 
    HostContainer testHosts; 
    Host * newHostPtr; 
    newHostPtr = new Host; 
    testHosts.insert(boost::shared_ptr<Host>(newHostPtr)); 

    return 0; 
} 
+0

Gracias por la ayuda. Buscaré en punteros compartidos: si no uso un ptr, ¿eso significa que cada objeto se almacena en dos lugares de la memoria (una vez creada y luego otra vez en el contenedor)? Además, Host es una clase, y Host :: id es una variable de miembro privada. Estoy tratando de averiguar cómo usar la función miembro Host :: getID() como mi extractor de claves si HostContainer está lleno de Host * o shared_ptr ... – Sarah

+0

Se agregó la función de miembro 'get_id' a mi respuesta. Si no usa 'shared_ptr' significa que cada' Host' se copiará en el contenedor MultiIndex y la copia estará allí hasta que lo elimine de allí. –

+0

Recibo un error de compilación en la misma línea que antes: "main.cpp: 57: error: no se pudo convertir el argumento de la plantilla '& Host :: getID' a 'int (Host :: *)() const'". – Sarah

Cuestiones relacionadas