2010-04-15 5 views
6

Ich programmiere eine agentenbasierte Simulation und habe entschieden, dass Boosts MultiIndex wahrscheinlich der effizienteste Container für meine Agenten ist. Ich bin kein professioneller Programmierer, und mein Hintergrund ist sehr fleckig. Ich habe zwei Fragen:Boost MultiIndex - Objekte oder Zeiger (und wie man sie benutzt?)?

  1. Ist es besser, den Behälter, die Mittel enthalten haben (der Klasse Host) selbst, oder ist es effizienter für die Behälter Host * zu halten? Hosts werden manchmal aus dem Speicher gelöscht (das ist mein Plan, sowieso ... lesen Sie weiter unter new und delete). Die privaten Variablen von Hosts werden gelegentlich aktualisiert, was ich über die Funktion modify im MultiIndex erreichen möchte. Es wird keine weiteren Kopien von Hosts in der Simulation geben, d. H. Sie werden nicht in anderen Containern verwendet.
  2. Wenn ich Zeiger auf Hosts verwende, wie richte ich die Schlüsselextraktion richtig ein? Mein Code unten kompiliert nicht.
// 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); 
    ... 
} 

ich nicht genau analog Beispiel in der Boost-Dokumentation, und meine Kenntnisse in C++ Syntax ist immer noch sehr schwach finden. Der Code scheint zu funktionieren, wenn ich alle Zeigerreferenzen durch die Klassenobjekte selbst ersetze.


so gut ich es impliziert die Boost-documentation (siehe Übersichtstabelle unten) lesen kann, sollte ich in der Lage sein, Member-Funktionen mit Zeigerelemente zu verwenden.

Antwort

7

Wenn Host viele Daten enthält, können Sie shared_ptr verwenden, um das Kopieren zu vermeiden. Sie könnten mit Multiindex shared_ptr in es verwenden:

#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; 

Dann könnten Sie es wie folgt verwenden:

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

    return 0; 
} 
+0

Sie für die Hilfe danken. Ich werde in geteilte Zeiger schauen - wenn ich kein ptr verwende, bedeutet das, dass jedes Objekt an zwei Stellen im Speicher gespeichert wird (einmal beim Erstellen und dann wieder im Container)? Außerdem ist Host eine Klasse und Host :: id ist eine private Membervariable. Ich versuche, herauszufinden, wie die Mitgliedsfunktion Host :: getID() als Schlüsselextraktor verwendet wird, wenn HostContainer voll von Host * oder shared_ptr ist ... – Sarah

+0

Hinzugefügt Mitgliedsfunktion 'get_id' zu meiner Antwort. Wenn Sie 'shared_ptr' nicht verwenden, bedeutet dies, dass jeder' Host' in den MultiIndex-Container kopiert wird und die Kopie dort ist, bis Sie sie von dort entfernen. –

+0

Ich bekomme einen Kompilierfehler in der gleichen Zeile wie zuvor: "main.cpp: 57: Fehler: konnte das Template-Argument '& Host :: getID' nicht zu 'int (Host :: *)() const'" konvertieren. – Sarah