Map Initialiserung mit eigener Compare Funktion geht schief
-
Ich möchte eine statische map Variable anlegen, dessen Schlüssel ein std::string ist und eine eigene Compare Funktion besitzt. Leider funktioniert das Initialisieren nicht richtig, da Elemente in der Initialisierungsliste nicht übernommen werden.
#include <iostream> #include <map> struct comp1 { template <typename T> bool operator()(const T &s1, const T &s2) const { return s1.size() > s2.size(); } }; struct comp3 { template <typename T> bool operator()(const T &s1, const T &s2) const { return s1 > s2; } }; int main() { static const std::map<std::string, int, comp1> L1 = { { "a", 1 }, { "b", 2 }, { "c", 3 } }; std::map<std::string, int> L2 = { { "a", 1 }, { "b", 2 }, { "c", 3 } }; std::map<int, std::string, comp3> L3 = { { 1, "a" }, { 2, "b" }, { 3, "c" } }; std::cout << "Count: " << L1.size() << "\n"; // Hier kommt erstaunlicherweise 1 heraus! std::cout << "Count: " << L2.size() << "\n"; std::cout << "Count: " << L3.size() << "\n\n"; return 0; }
Eigentlich würde ich hier als Ergebnis 3 3 3 erwarten, jedoch bekomme ich 1 3 3.
Den Fehler bekomme ich sowohl unter VS als auch unter Qt.
Was mache ich hier falsch?
-
Du vergleichst die Stringlängen. "a", "b" und "c" sind gleich lang und daher für L1 alle drei gleich.
-
Ich würde von deiner Vergleichsfunktion her 1 3 3 erwarten. Schließlich fügst du 3x den gleichen Schlüssel ein, und eine nicht-multi-map kann jeden Schlüssel nur einmal.
Definition von "gleich": a ist gleich b, wenn a nicht kleiner b und b nicht kleiner a. Wende das mal auf deine Vergleichsfunktion und
"a"
,"b"
und"c"
an !
-
Danke für die Info. Es funktioniert jetzt.