STL maps vergleichen



  • Hallo

    ich moechte von zwei STL maps jeweils die Keys miteinander vergleichen und wenn dabei unterschiedliche sind die values dieser keys rausschmeissen aus der map. Wie mache ich das? Ich habs bisher so versucht:

    for(map<string,PointN>::iterator mapIter = data1.begin(); mapIter != data1.end(); ++mapIter)
    	{
    		string szName = mapIter->first;
    		map<string, PointN>::iterator result;
    		result = find(data2.begin(), data2.end(), szName);
    	}
    

    Ich hole mir den ersten key aus meiner data1 und suche den key in data2.
    Allerdings bekomme ich da ganz viele Fehler in Hinblick auf operator==, unter anderem:

    g:\Program Files\Microsoft Visual Studio .NET\Vc7\include\algorithm(31): error C2784: 'bool std::operator ==(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)' : could not deduce template argument for 'const std::_Tree<_Traits> &' from 'std::pair<_Ty1,_Ty2>'
    with
    [
    _Ty1=const std::string,
    _Ty2=PointN
    ]

    Wie mache ich das dann? Bzw. was ist hier falsch? Oder anders: Gehe ich mein Problem ganz falsch an? Ich brauche nur die Daten die in beiden maps gleich sind und die die unterschiedlich sind muessen raus. Geht das auch anders?



  • der globale Algorithmus find() benötigt den kompletten Elementtyp der map (also ein pair<string,PointN> in deinem Fall) - du solltest hier besser die entsprechenden Methoden der map verwenden:

    result=data2.find(szName);
    


  • Danke! Das funktioniert. Leider hatte ich vergessen dass in einer map die Werte ja lexikographisch geordnet werden. Das kann ich aber nicht gebrauchen. Gibts eine Moeglichkeit das zu verhindern oder muss ich dann ein anderes Object statt der map benutzen?



  • Wenn dir die vorhandene Sortier-Reihenfolge nicht gefällt, solltest du dir eine eigene definieren 😉 (du brauchst dazu ein binäres Prädikat, das angibt wann ein string "kleiner" ist als ein anderer)

    PS: Ich weiß nicht, ob es dir hilft, aber eventuell kommst du mit den set_...-Algorithmen weiter 😉


Anmelden zum Antworten