2009-08-03 3 views
1

Ich habe eine Klasse wie diesesContainer mit zwei Indizes (oder eine Verbindung Index)

class MyClass 
{ 
    int Identifier; 
    int Context; 
    int Data; 
} 

und ich plane es in einem STL-Container zu speichern, wie

vector<MyClass> myVector; 

aber ich werde zugreifen müssen entweder durch den extenalen Index (unter Verwendung myVector[index]); und die Kombination von Identifier und Context die in diesem Fall ich eine Suche mit etwas führen würde wie

vector<MyClass>::iterator myIt; 
for(myIt = myVector.begin(); myIt != myVector.end(); myIt++) 
{ 
    if((myIt->Idenfifier == target_id) && 
     (myIt->Context == target_context)) 
     return *myIt; //or do something else... 
} 

Gibt es einen besseren Weg, die Daten zu speichern oder einen Index?

Antwort

2

Boost::Multi-Index hat genau diese Funktionalität, wenn Sie sich die Boost-Abhängigkeit leisten können (nur Header). Sie würden einen random_access Index für den Array-artigen Index und entweder, hashed_non_unique, ordered_unique oder ordered_non_unique (abhängig von Ihren gewünschten Eigenschaften) mit einem Funktor verwenden, der Identifier und Kontext miteinander vergleicht.

+0

Ich mag diese Antwort am besten. –

0

Ja, aber wenn Sie Geschwindigkeit wollen, müssen Sie Raum opfern. Speichern Sie es in einer Sammlung (wie einem STL-Set) mit dem Bezeichner/Kontext als Schlüssel, und speichern Sie es gleichzeitig in einem Vektor. Natürlich möchten Sie nicht zwei Kopien der Daten selbst, also speichern Sie sie im Set mit einem Smart Pointer (auto_ptr oder variant) und speichern Sie sie im Vektor mit einem dummen Zeiger.

+0

STL-Container können auto_ptrs nicht akzeptieren, da sie eine inkompatible Besitzersemantik haben. –

+0

Ich vermutete das, weshalb ich "oder Variante" gesagt habe. Würde ein shared_ptr funktionieren? –

+0

Beantwortete meine eigene Frage: http://stackoverflow.com/questions/956764/collection-specialized-for-sharedptr –

1

Wir müssen Ihre Verwendung kennen. Warum müssen Sie in der Lage sein, sie nach Index zu bekommen, und wie oft müssen Sie den Container nach einem bestimmten Element durchsuchen.

Wenn Sie es in einem std::set speichern, wird Ihre Suchzeit mit O (ln n) sein, aber Sie können sie nicht per Index referenzieren.

Wenn Sie eine std::vector verwenden, können Sie sie indizieren, aber Sie müssen std::find verwenden, um ein bestimmtes Element zu erhalten, das O (n) sein wird.

Aber wenn Sie einen Index benötigen, um es an andere Dinge zu übergeben, könnten Sie einen Zeiger verwenden. Verwenden Sie einen Satz für eine schnellere Suche und übergeben Sie Zeiger (keine Indizes) an bestimmte Elemente.

Verwandte Themen