2016-10-27 3 views
1

I haben die folgende Struktur:Initialize Vektor mit verschiedenen Werten

enum model_class 
{ 
    ... 
}; 

struct SModelData 
{ 
    string  m_strName; 
    model_class m_class; 
    vector<int> m_parts; 
    int   m_iSeats; 

    SModelData(...) : ... {} 
}; 

const multimap<int, SModelData*> models_data = 
{ 
    { 400, new SModelData("Landstalker", STUFF, ***, 4) }, 
    ... 
}; 

m_parts können unterschiedliche Werte haben int (const) und deren Zählung. Zum Beispiel Modell 401 wird haben: 6661, 6662, 6669, 6674; Modell 402: 6669, 6670; usw.

Was ist der beste Weg, um diese Sachen zu bekommen?

+3

Zunächst möchte ich Ihnen nicht empfehlen habe Zeiger auf die Struktur in deiner Karte. Zweitens, brauchst du wirklich eine 'std :: multimap'? Kann ein einzelner Schlüssel mehrere Werte haben? Drittens initialisieren Sie einen Vektor, der dem Initialisieren der Map sehr ähnlich ist, indem Sie eine in Klammern eingeschlossene Liste verwenden, um eine ['std :: initializer_list'] zu erstellen (http://en.cppreference.com/w/cpp/utility/initializer_list). . Wenn Sie keinen Zeiger benötigen, brauchen Sie übrigens auch keinen Konstruktor. –

+0

@Someprogrammerdude, ich habe den Typ in die Grundkarte geändert, danke. Es funktioniert gut mit initializer_list (vielleicht), danke. –

Antwort

1

Mit roh besitzen Zeiger in STL-Containern gespeichert ist in der Regel eine schlechte Idee, und Fehlerquelle:

const multimap<int, SModelData*> models_data = 

Ich würde es vorziehen, entweder Smart besitzen Zeiger (zB shared_ptr<SModelData> für Shared Ownership Semantic, oder unique_ptr<SModelData> für eindeutige Besitz Semantik), oder einfach SModelDataWerte verwenden.

Sind Sie außerdem sicher, dass Sie eine multimap verwenden möchten?

Vielleicht ein map mit Werten wäre in Ordnung?

zB:

const map<int, SModelData> models_data 

initialisieren Ihre const map, können Sie nur ++ 11 initializer Listen verwenden, C, oder eine Lambda, zB:

const auto models_data = []() -> map<int, SModelData> { 
    map<int, SModelData> data; 

    // ... Fill your map 

    return data; 
}(); 
+0

Vielen Dank für Ihre Antwort! Yep, ich habe bereits statt SModelData * anstelle von Multimap und SModelData auf map verschoben. –

Verwandte Themen