2009-08-06 15 views
0

Ich hatte gehofft, Sie könnten mir helfen, diese Idee ausspülen. Ich möchte Sets erstellen. Und ich denke, ich möchte sie so konstruieren. Haben Sie einen Vektor von Zeigern wie folgt aus:Vektor von Zeigern zu einem Set oder Sets

vector<char*> sets; 

Wenn der Benutzer in einem einzigen Buchstaben eingeben den Namen des Satzes ‚A‘ zum Beispiel darzustellen. Aber dann möchte ich, dass 'A' auf einen anderen Container zeigt, damit ich die Elemente hinzufügen kann.
Ist das ein Vektor von Vektoren? Wie zeigt "A" auf seinen Container?

Antwort

2

Was Sie brauchen, ist ein map.

std::map<char, std::vector<YourElementClass> > 
+0

Wenn es ein einzelner Buchstabe ist: std :: map > noch besser - verwenden Sie einfach c-Array mit und machen Sie diesen Buchstaben zu einem Index. – Drakosha

+1

Verwenden Sie char * nicht als Schlüssel für eine Karte. Verwenden Sie std :: string. Ich glaube nicht, dass die Zeigerreihenfolge das ist, was Sie wollen. –

+3

Die Zeigerreihenfolge ist kein allzu großes Problem (es sei denn, sie kümmern sich wirklich um die Reihenfolge, in der sie gespeichert sind und/oder versuchen, sie zu sortieren) ... wichtiger ist, dass Sie char * nicht wollen, denn das wird nur sein Gleich, wenn * genau die gleiche Zeichenkette * (dh der gleiche Speicher) als Schlüssel verwendet wird, anstatt zwei Zeichenketten, die gleich sind, aber in verschiedenen Speicherbereichen gespeichert sind. – workmad3

1

Ich denke, ein std::map<char*, std::set<Type> > Ihre Bedürfnisse befriedigen würde (wo Typ ist, was Sie in Ihren Sets gespeichert werden sollen).

Nebenbei bemerkt, ist es generell eine schlechte Idee, eine eigene Version von STL-Containern zu implementieren.

1

Sie einen Vektor von Vektoren in diesem Fall können Sie Ihre Auswahl an Tasten, da begrenzt:

vector<vector<MyType> > container(128); 

Nun können Sie die richtigen Container zugreifen, indem Sie die eingegebenen Zeichen als Schlüssel:

MyType myTypeInstance; 
char input = 'a'; 
container[input].push_back(myTypeInstance); 

Dies sollte schneller sein als mit einem std::map (dh map<char, MyType>), erfordert aber die Zuweisung von allen möglichen Container im Vordergrund. Es verschwendet auch Platz mit den nicht druckbaren Zeichen im Bereich von 0 bis 31. Das letztere Problem könnte adressiert werden, indem nur 96 Werte zugewiesen und 32 von der Benutzereingabe subtrahiert werden.

Abhängig von der Komplexität des Typs in Ihrem inneren Container, ist es möglicherweise vorzuziehen, Zeiger (oder einen Smart-Zeiger wie boost::shared_ptr) zu speichern, statt nach Wert zu speichern.

vector<vector<shared_ptr<MyType> > > container(96); 

Beachten Sie, dass, wenn Sie rohe Zeiger tun verwenden Sie müssen sicher sein, Elemente zu löschen, da sie nicht durch den Vektor wiedergewonnen werden.

Verwandte Themen