Datentabelle in C++?



  • Hallo zusammen,

    ich habe eine Tabelle mit Punkten (x und y Koordinate). Die Punkte sind konstant und sollen in einer Art Tabelle (ähnlich, wie eine MySQL Tabelle) gespeichert werden, damit ich sie zur Laufzeit auslesen kann. Zu dem Punkt speichere ich noch einen einzigartigen Namen, der den Punkt identifiziert.
    Ich stelle mir das so vor, dass ich die Daten über eine Funktion (nennen wir sie static TableRow* Table::GetRow(string id);) auslesen kann.

    Wenn die Tabelle wie folgt aussähe:

    |   id |      x |      y |
    +------+--------+--------+
    | Pkt1 | 182,82 | 837,12 |
    | Pkt2 | 633,34 | 726,12 |
    

    könnte ich also mit Table::GetRow("Pkt1") die erste Zeile auslesen.
    Falls möglich möchte ich dann (ähnlich wie in PHP) mit einer Funktion

    template<typename T> GetValue(string row);
    

    den x und y Wert auslesen, indem ich

    GetValue<float>("x");
    

    aufrufe.

    Wie realisiert man das am Besten?

    Mfg dercoder



  • http://en.cppreference.com/w/cpp/container/map
    https://ideone.com/9FRLes

    #include <map>
    #include <string>
    #include <iostream>
    
    struct point
    {
        float x;
        float y;
    };
    
    int main()
    {
        std::map<std::string, point> m;
    
        // Einfügen über operator []
        m["Blubb"] = point{435.6, 234.2};
    
        // Einfügen über insert
        m.insert(std::make_pair("FooBar", point{654.3, 345.8}));
    
        // Auslesen über operator []
        // Wenn noch nicht in map wird ein point default-initialisiert angelegt.
        auto& p1 = m["FooBar"];
        auto& p2 = m["DoesNotExistYet"];
        std::cout << "FooBar" << ": " << p1.x << " - " << p1.y << '\n';
        std::cout << "DoesNotExistYet" << ": " << p2.x << " - " << p2.y << '\n';
    
        // Auslesen über find (wenn man wissen will, ob ein Eintrag überhaupt existiert oder nicht)
        auto found = m.find("Blubb");
        if (found != m.end())
            std::cout << found->first << ": " << found->second.x << " - " << found->second.y << '\n';
    }
    

    (Kompilieren mit VS 2013 oder über g++ mit -std=c++11 -Wall -pedantic.)



  • VS 2012 spuckt mir den folgenden Fehler aus:

    error C2275: 'point' : illegal use of this type as an expression
    

    für die Zeile

    m["Blubb"] = point{435.6, 234.2};
    

    Liegt das an VS 2012?



  • Ja, denke schon. Das Konstrukt nennt sich Uniform Initialization und wurde glaub ich noch nicht vom VS2012 unterstützt.

    Workaround: Schreib dirn Konstruktor für das Point-Struct und benutz den wie gewohnt



  • Okay, thx.
    Habe VS2013 an meiner Hochschule zum kostenlosen Download also np


Anmelden zum Antworten