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?)?
- ¿Es mejor tener el contenedor contiene los agentes (de clase
Host
) a sí mismos, o es más eficiente para el envase para guardarHost *
? Los hosts a veces se eliminarán de la memoria (ese es mi plan, de todas formas ... necesito leer ennew
ydelete
). Las variables privadas de Hosts se actualizarán ocasionalmente, lo que espero hacer a través de la funciónmodify
en MultiIndex. No habrá otras copias de Hosts en la simulación, es decir, no se usarán en ningún otro contenedor. - 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.
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
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í. –
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