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?



  • @Quiche-Lorraine

    Du vergleichst die Stringlängen. "a", "b" und "c" sind gleich lang und daher für L1 alle drei gleich.


  • Mod

    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.


Anmelden zum Antworten