2 Maps verbinden



  • Hi!

    Ich habe einmal die Map "A" und die Map "B" und möchte jetzt die Daten aus Map "B" in die von Map "A" einfügen. Wie mache ich das?

    std::map bietet leider keine apped-Methode wie std::string 😞



  • Quick and Dirty:

    for(alle in b) {
        a.dazutun(b);
    }
    


  • oh man, haben wir hier TGGC?



  • copy( b.begin(), b.end(), inserter(a, a.begin()));
    

  • Administrator

    MFK schrieb:

    copy( b.begin(), b.end(), inserter(a, a.begin()));
    

    Ich würde daher eher die Sache ein wenig umschreiben und ein paar Ergänzungen amchen:

    #include <map> // sollte klar sein ;)
    #include <iterator> // für std::inserter
    #include <algorithm> // für std::copy
    
    // ...
    
    std::copy(b.begin(), b.end(), std::inserter(a, a.end()));
    // Hier habe ich als insertpoint a.end() angegeben.
    // Bei einer Map ist dieser Punkt ein Hinweis und kann das Einfügen
    // beschleunigen. Da wir die B-Map von vorne nach hinten durchgehen,
    // fügen wir der A-Map also immer hinten etwas dazu.
    

    Grüssli



  • Dravere schrieb:

    // Bei einer Map ist dieser Punkt ein Hinweis und kann das Einfügen
    // beschleunigen. Da wir die B-Map von vorne nach hinten durchgehen,
    // fügen wir der A-Map also immer hinten etwas dazu.

    Es wird nicht hinten angefügt, sondern dort, wo es nach der Sortierung der Map hingehört. Insofern ist es Jacke wie Hose, ob man begin oder end benutzt, es sei denn, man weiß, dass die Inhalte der einen Map grundsätzlich größer (im Sinne der Sortierordnung) sind als die der anderen.


  • Administrator

    MFK schrieb:

    Es wird nicht hinten angefügt, sondern dort, wo es nach der Sortierung der Map hingehört. Insofern ist es Jacke wie Hose, ob man begin oder end benutzt, es sei denn, man weiß, dass die Inhalte der einen Map grundsätzlich größer (im Sinne der Sortierordnung) sind als die der anderen.

    Dir ist schon mal die Idee gekommen, dass die A-Map und B-Map vom gleichen Typ sind? Oder dass sie zumindest ähnliche Schlüssel haben und eine ähnliche Sortierung. Daher kann die Sortierung in der B-Map gleich auf die A-Map angewendet werden. Deshalb ein Anfügen an das Ende der A-Map, da wenn die Sortierung gleich ist, das Objekt auch tatsächlich dort hinkommt.

    Grüssli



  • Dravere schrieb:

    Deshalb ein Anfügen an das Ende der A-Map, da wenn die Sortierung gleich ist, das Objekt auch tatsächlich dort hinkommt.

    Blödsinn.

    Wenn A die Schlüssel { 1, 3, 5 } enthält, und B { 2, 4, 6 }, glaubst du wirklich, dass danach in A { 1, 3, 5, 2, 4, 6 } steht?

    In einer Map wird nur dann "hinten" angefügt, wenn der neue Schlüssel größer als alle bereits existierenden ist. In der Problembeschreibung steht aber nirgends, dass alle Schlüssel in B größer als die in A sind.

    Der Iterator-Parameter bei map::insert hat nur den Zweck, die Suche nach der Einfügestelle zu beschleunigen.

    Aber ich stelle gerade fest:

    a.insert( b.begin(), b.end() );
    

  • Administrator

    danke MFK, mein Hirn hat grad versagt. Die andere Map kann ja noch Elemente beinhalten ...
    Eindeutiges Indiz, ich sollte was essen gehen 🙂

    Grüssli



  • Mapler schrieb:

    Hi!

    Ich habe einmal die Map "A" und die Map "B" und möchte jetzt die Daten aus Map "B" in die von Map "A" einfügen. Wie mache ich das?

    std::map bietet leider keine apped-Methode wie std::string 😞

    Doch gibt es! Man duerfte halt nur nicht so faul sein und mal in der Doku nachschlagen, wie diese Funktion bei der Map heisst! f'`8k

    Autocogito

    Gruß, TGGC (Das kommt gut)


Anmelden zum Antworten