datenbank als std::list



  • Tip: http://www.boost.org/doc/html/string_algo/usage.html#id2742674

    oder mit der Stdlib:

    std::string s ("HaLLeLuJa");
    
    std::transform (s.begin(),s.end(), s.begin(), tolower);
    


  • Artchi schrieb:

    std::transform (s.begin(),s.end(), s.begin(), tolower);
    

    Wird u.U. schiefgehen, wenn die Implementierung tolower nicht als Funktion sondern nur als Makro anbietet (keine Ahnung ob das durch den Standard erlaubt ist wenn in der Definition von "the tolower function" die Rede ist, aber bei bestimmten G++-Versionen ist es der Fall). Dann einfach eine eigene (inline-)Funktion hernehmen, die tolower aufruft 😉



  • Hallo,

    Da gibts doch noch was von Hume
    http://fara.cs.uni-potsdam.de/~kaufmann/stricmp.h



  • Wenn du die Liste immer sortiert haben willst bietet sich vielleicht ein std::set oder std::multiset an. Kannst dir die beiden ja mal ansehen.



  • Hi
    Ich arbeite mich langsam so durch die std

    ich wollte das als keymap implementieren ( zumindestens für meine entry klasse um die dann in eine list einzufügen )

    allerdings bin ich drauf gekommen, dass keymap das immer sortiert.
    das ist ein problem, weil ich eine methode toString einbauen wollte, die mir gleich die aus allen values der keymap einen string baut.
    nur sind die natürlich alphabetisch sortiert und das ist ein problem für mich.
    gibt es eine möglichkeit das zu unterbinden bzw. die reihenfolge der einträge so zu bekommen wie sie angelegt wurden - oder kann ich die keymap in dem fall vergessen?.

    lg
    Verucca



  • Hi,

    also wenn Du keine Sortierung nach keyvalue haben möchtest, kannst Du einfach einen vector nehmen - allerdings sorgt der auch nicht für "uniqueness":

    std::vector<pair<keyval, data> > v;
    

    Wenn ich mich nicht täusche, gibt's in der STL keinen Container, der "uniqueness" sichert trotzdem nicht sortiert...
    Zur Not (wenn es nicht beim Eintragen schon erkannt werden soll) kannst Du das mittels unique() hinterher korrigieren.

    Oder Du nutzt eine

    std::map<keyval, pair<entryNo, data> > m;
    

    oder gleich

    struct keyValAndEntryNo {
       keyval k;
       entryNo e;
    };
    
    std::multimap<keyValAndEntryNo, data> > m;
    

    (mit einem geeigneten Komparator (der nur k vergleicht))

    ... und sortierst bei der Nutzung. (ungeschickterweise ist dabei entryNo nicht mehr eindeutig)

    Gruß,

    Simon2.



  • hey c++ ist echt cool 🙂

    aber wie iterier ich dann über das ding?

    vector<string,string>::iterator iter;
    for( iter = keymap.begin(); iter != keymap.end(); ++iter ) 
    {
        cout << "Key: '" << iter->first << "', Value: " << iter->second << endl; 
    }
    

    so geht es vermutlich nicht - aber wie deffinier ich den iterator richtig?

    lg
    verucca

    edit:
    und scheinbar hab ich dann nicht so eine praktische find methode - die müsste ich mir dann wohl selbst schreiben.
    das war ja das schöne an der keymap "keymap.find(key)" usw

    und ich seh schon so wird das gemacht:

    vector<pair<string, string> >::iterator iter;
      	for( iter = keymap.begin(); iter != keymap.end(); ++iter ) 
      	{
        cout << "Key: '" << iter->first << "', Value: " << iter->second << endl; 
        }
    

    allerdings werd ich mir wohl alle funktionen einer keymap selbst schreiben müssen.
    also find usw....
    naja egal - es ist brauchbar..
    lg
    Verucca



  • Naja, es gibt doch auch ein find() in der STL:
    http://www.cppreference.com/cppalgorithm/index.html

    😃

    Gruß,

    Simon2.



  • Nach was willst du denn suchen? Eine map hat Schlüssel, weil man nach ebend diesen eigentlich suchen will. Und find von map ist dann genau richtig.



  • naja das ganze dient ja haupsächlich dazu cpp zu lernen :).

    aber ich schreib immer noch an dieser minni datenbank
    funtioniert ja schon alles ganz gut, nur möchte ich das jetzt etwas generischer angehen - etwas hald ....

    ich erstelle also eine classe entry die im prinzip als keymap funktioniert.
    man kann also einen key erstellen und values speichern
    Beispiel:
    adress foo
    name bar
    usw...
    als methoden;
    string get(string key)
    set(string key, string value)
    insert (string key) // adds a new keyvalue to database.
    delete (string key) // removes a key.
    string toString() // liefert einen string über den ganzen datensatz zurück.

    der construktor von dem datenbank objekt wird jetzt mit der entry klasse gefüttert.
    die datenbank kann jetzt die key felder auslesen und weiß genau was verwaltet werden soll.
    in eine std::list wird dann classe entry als datensatz eingefügt.

    jetzt werden noch suchmethoden und sortieren bzw. suchen mit sortierter ausgabe implementiert und schon ist das fertig.
    dann noch methoden database.loadfromfile, database.savetofile und es ist halbwegs komplett.

    für die entry klasse hab ich mir zuerst eine keymap gedacht - sozusagen ein wrapper für die map mit ein paar mehr methoden ( toString zum beispiel )
    bis ich dauf gekommen bin, das das sortiert wird war die idee eh ganz nett - aber schließlich muss der datensatz schon die reihenfolge beibehalten ... - sonst gibts beim speichern und laden vom file probleme - da würden dann irgendwann falsche werte rein kommen usw zumindestens wenn man sich hier eine sinnvolle reihenfolge vorstellt.

    vorname nachname adress plz ......

    ich beweg mich eh schön langsam durch die std - man braucht hald ein projekt um eine sprache zu lernen 🙂

    lg
    Verucca

    edit:

    aber gleich eine frage dazu.
    wie soll ich bei einem pair den zugreifen auf das element?
    std::find liefert einen iterator zurück ... ok.

    vector<pair<string, string> >::iterator iter;
    iter = find( keymap.begin()->first, keymap.end()->first, "type" );
    

    wie finde ich da die elemente - ist eine interessante methode - ich hätte ja klassisch ein 2 dimensionales array genommen ...



  • Warum benutzt du nicht die find von map? Aber was du mit "elemente" meinst, weiß ich nicht.



  • naja map kann ich ja nicht nehmen, weil map ja sortiert.
    und elemente hab ich glaub ich falsch ausgedrückt
    make_pair(x,y) hab ich vermutlich gemeint.

    wenn ich das in einen vector verpacke, weiß ich nicht so genau wie ich dem ganzen etwas zuweisen kann.
    rausholen kann ich das ja mit dem iterator - aber wie schreib ich dann drauf?

    lg
    Verucca



  • mit push_back fügst du was in den Vector hinzu.


Anmelden zum Antworten