2016-04-15 12 views
2

Ich habe Daten wie folgt dargestellt:Wie kann ich gemischte Elemente in einer std :: map speichern?

enter image description here

Ich brauche diese Daten in meine C++ Anwendung zugänglich zu machen. Ich muss auch in der Lage sein, assoziativ über variable Schlüsselnamen auf Items zuzugreifen; zum Beispiel:

std::string key = "ema50"; 
double value = data[key]; 

A std::vector<std::map<std::string, double>> würde für diese groß sein, es sei denn ich bin nicht sicher, was ist mit dem groups Artikel zu tun. Ich möchte in der Lage den Zugang zu den testing oder validation Arrays für ein bestimmtes Element im Vektor:

int testingGroups[9] = data["groups"]["testing"]; 
int validationGroups[9] = data["groups"]["validation"]; 

Gibt es eine Weise, die ich dies erreichen kann? Ich bevorzuge es, Vektoren und Karten zu verwenden, aber ich bin offen für andere Lösungen, solange ich assoziativ auf Daten zugreifen kann.

Möchten Vorlagen verwenden wie beschrieben here den Weg gehen?

+0

könnten Sie Tupel verwenden. Sehen Sie, ob dies Ihren Anforderungen entspricht [Tupel-Klasse msdn] (https://msdn.microsoft.com/pt-br/library/bb982837.aspx). – Carafini

+0

Ist die Geschwindigkeit kritisch? Ich meine, Sie könnten diese Werte als Strings speichern und der Aufrufer könnte angeben, wohin er beim Zugriff auf die Daten konvertieren soll: 'data.get (key);'. – Galik

+0

Mögliches Duplikat von: https://stackoverflow.com/questions/25988288/is-there-anegegant-way-to-represent-a-map-containing-different-types-in-c- – Galik

Antwort

2

Die angenommene Antwort in der Verbindung, die Sie zur Verfügung gestellt haben, C++ std::map holding ANY type of value, ist eigentlich der Weg zu gehen. Im Wesentlichen wollen Sie eine Karte von VARIANTs - Objekte, die von irgendeinem Wert sein können, sogar eine andere Karte (die Ihnen die Möglichkeit gibt, mehrere Indizes zu haben, nur nicht so schön - zB wäre es so etwas wie Daten ["foo"]. asMap ["bar"]). Varianten sind im Allgemeinen ausgefallene Verbindungen mit einem Hinweiselement, z.

struct MyVariant { 
    int type; // or enum 
    union { 
     int asInt; 
     bool asBool; 
     double asDouble; 
     // etc... 
     std::map<std::string, MyVariant> asMap; 
    } 
};   

aber wie in der akzeptierte Antwort auf die Frage bezogen, müssen Sie in der Lage sein, intelligent mit anderen Zeigertypen, die Sie Vereinigung zu behandeln. Sie können ein Flags-Element hinzufügen, um den Besitz des Speichers zu kennzeichnen (tiefe Kopie), im Gegensatz zu einem Zeiger auf den Speicher, der nicht zu der Variante gehört (flache Kopie). Und - einer der gewerkschaftlich organisierten Typen kann eine andere Karte sein, mit der Sie eine beliebig tiefe Struktur erstellen können.

Verwandte Themen