insert-reihenfolge std::multimap



  • Hi!
    Kann mir jemadn sagen wie insert-reihenfolge in ner std::multimap festlege? Wenn ein insert mit einem bereits existierenden key aufgrufen wird, sollen die daten IMMER NACH dem extistierenden gespeichert werden. Dachte eingentlich das sich multimap von Haus aus an ne feste reihenfolge hält, ist aber nicht das fall... einmal landed der wert vor den bereits existierenden, einmal danach.. garad wie der wind bläst..



  • Hi,

    Wenn du willst das sie sortiert sind kannst dies mit less<class Key> / greater <class Key> erreichen:

    typedef multimap<short , value , less< short >    > LessSortedMMap;
    typedef multimap<short , value , greater< short > > GreaterSortedMMap;
    

    Ausserdem kannst mit

    equal_range(key)
    

    dir auch alle werte mit dem gleichen key ausgeben lassen!

    MfG

    eViLiSSiMo



  • es ghet mir nicht ums sortieren, das klappt ja.. die keys kommen immer schön der reihe nach. Das problem ist ein insert mit nem bereits existierenden key.

    Pos Key  Wert
    1   1    1
    2   2    2
    3   2    3
    4   5    4
    ...
    

    Wenn ich jetzt ein insert mit key=2 aufrufe soll das ding an postion 4 oder 2 lande, und zwar immer an der selben stelle. Zur zeit landet der wert einmal davor einmal danach...
    Ich ich glaube ich geh mal ne aktuelle SDK version ziehen... das ganze kommt mir immer komischer vor......



  • hi,

    am besten zeigste mal wie du das ganze einfügst!

    Poste mal einen Codeausschnitt der den insert - Befehl zeigt so wie du ihn implementiert hast!



  • // TEST (das gibts doch nicht... ARGL)
    for(int i=0;i<100;i++)
    {
       std::multimap<unsigned long, unsigned long> testmap;
       // testwerte
       testmap.insert(std::pair<unsigned long,unsigned long>(5,1));
       testmap.insert(std::pair<unsigned long,unsigned long>(7,2));
       testmap.insert(std::pair<unsigned long,unsigned long>(2,3));
       testmap.insert(std::pair<unsigned long,unsigned long>(7,4));
       testmap.insert(std::pair<unsigned long,unsigned long>(6,5));
       testmap.insert(std::pair<unsigned long,unsigned long>(0,6));
       testmap.insert(std::pair<unsigned long,unsigned long>(7,7));
    
       std::multimap<unsigned long, unsigned long>::iterator it;
       unsigned long lastVal=0;
       for (it=testmap.begin(); it !=testmap.end(); it++)
       {
          if(it->first==7)
          { 
            if(it->second < lastVal)
            { 
                ASERRT(FALSE); // VERDAMMT NOCH MAL!!! ARGL!!!
            }
            lastVal = it->second;
          }
       }
    }
    

    Das ding haut mir nach spätesten 40 durachläuen das ASSERT um die ohren (nicht immer der selbe durchlauf)... 🙄



  • Ein update der MSDN version hat das problem gelöst..... 🙄 🙄 🙄 🙄



  • Hi

    so geht das:

    testmap.insert(testmap.end(),std::pair<unsigned long,unsigned long>(7,2));
    testmap.insert(testmap.end(),std::pair<unsigned long,unsigned long>(7,4));
    testmap.insert(testmap.end(),std::pair<unsigned long,unsigned long>(7,7));
    

    😉



  • eViLiSSiMo schrieb:

    Hi

    so geht das:

    testmap.insert(testmap.end(),std::pair<unsigned long,unsigned long>(7,2));
    testmap.insert(testmap.end(),std::pair<unsigned long,unsigned long>(7,4));
    testmap.insert(testmap.end(),std::pair<unsigned long,unsigned long>(7,7));
    

    😉

    nur aus interesse.. fügt das nicht den datensatz am ende der map ein? (was ich wollte ist, das jeder neue key=7 nach alle breits vorhandenen key=7 sätzen gespeichert wird, aber noch vor den key=8 werten 🤡 )

    naja.. egal, geht jetzt ja 🤡


Anmelden zum Antworten