std::map sortieren...



  • Hi,
    das ist mein Code und mein Problem findet ihr unter dem Code:

    #include <iostream>
    #include <iomanip>
    #include <string>
    #include <algorithm>
    #include <map>
    
    typedef std::map<std::string, int> wordMap;
    
    int main() {
    	wordMap words;
    	std::string input = "Test, Test, Test, Test... Noch ein Test, loool, lol...";
    	std::string temp;
    	for (int i = 0; i < input.length(); ++i) {
    		if (isalpha(input[i])) {
    			temp += input[i];
    		} else {
    			if (!temp.empty()) {
    				std::transform(temp.begin(), temp.end(), temp.begin(), tolower);
    				words[temp] = ++((int)words[temp]);
    				temp.clear();
    			}
    		}
    	}
    
    	std::cout << "-- Result(s) --\n\n";
    	for (wordMap::iterator it = words.begin(); it != words.end(); ++it) {
    		std::cout << (*it).first << std::setw(25-(*it).first.length()) << " = " << std::setw(25) << (*it).second << "\n";
    	}
    	return 0;
    }
    

    Wie kann ich diese Map jetzt nach der Anzahl sortiert ausgeben? Danke im Voraus!



  • void sort( iterator start, iterator end, StrictWeakOrdering cmp );



  • Bringt mich nicht weiter...



  • Du könntest die Werte der Map in eine andere (vertauschte) Map eintragen:

    std::map<int, std::list<std::string> >
    

    und dann diese Map (sowie die Liste) ausgeben.
    Die Liste wird benötigt, da ja mehrere Strings dieselbe Anzahl aufweisen können.



  • Man könnte auch gleich eine std:: multimap verwenden, dann braucht man die std::list nichtmehr 😉

    Oder man stopft die Werte in einen std::vector rein, schreibt seinen eigenen Vergleichs-Funktor, und verwendet std::sort wie im 1. Beitrag schon vorgeschlagen wurde:

    template <class P> struct compare_second
    {
        bool operator()(P const& a, P const& b) const
        {
            return a.second < b.second;
        }
    };
    
    void foo()
    {
        std::map<std::string, int> m;
    
        // ... m anfüllen ...
    
        std::vector<std::pair<std::string, int> > v(m.begin(), m.end());
        std::sort(v.begin(), v.end(), compare_second<std::pair<std::string, int> >());
        // ausgeben, fertig.
    }
    

Anmelden zum Antworten