如何在C ++中对地图中的值进行排序

时间:2017-06-09 00:46:30

标签: c++ sorting c++11 dictionary c++14

我正在尝试根据值对输出进行排序,我不确定如何处理它。 这是我目前的输出:

 E:2  
 H:1 
 I:3 
 L:2 
 N:3 
 O:2 
 S:2
 T:1 
 Y:1 

这就是我想要输出的方式:

 I: 3 
 N: 3
 E: 2 
 L: 2 
 O: 2 
 S: 2 
 H: 1 
 T: 1 
 Y: 1

我的代码:

#include<iostream>
using std::cin;
using std::cout;
using std::endl;
#include<string>
using std::string;
#include<map>
using std::map;
#include<algorithm>
using std::sort;

int main()
{
    string input;
    int line = 0;
    map<char, int> letters;
    while (getline(cin, input))
    {
        line += 1;
        for (int i = 0; i < input.length(); i++)
        {
            if (isalpha(input[i]))
            {
                if (letters.count(toupper(input[i])) == 0)
                {
                    letters[toupper(input[i])] = 1;
                }
                else
                {
                    letters[toupper(input[i])] += 1;
                }
            }
        }
    }

    cout << "Processed " << line << " line(s)." << endl;
    cout << "Letters and their frequency:" << endl;
    for (auto it = letters.cbegin(); it != letters.cend(); ++it)
    {

        cout << it->first << ":" << it->second << "\n";

    }
}

1 个答案:

答案 0 :(得分:1)

我们初学者应该互相帮助。:) 在任何情况下,您都需要第二个容器,因为std :: map已经按键排序。 一般方法是将映射复制到其他容器中,并在输出之前对新容器进行排序。 对于您的任务,您可以使用std :: set作为第二个容器。 这个给你。 #include&lt; iostream&gt; #include&lt; map&gt; #include&lt; set&gt; #include&lt; utility&gt; int main() {     std :: map&lt; char,size_t&gt; m =     {         {&#39; E&#39;,2},{&#39; H&#39;,1},{&#39;我&#39;,3},{&#39; L&#39;,2 },         {&#39; N&#39;,3},{&#39; O&#39;,2},{&#39; S&#39;,2},{&#39; T&#39;,1 },         {&#39; Y&#39;,1}     };     for(const auto&amp; p:m)     {         std :: cout&lt;&lt; &#34; {&#34; &LT;&LT; p.first&lt;&lt; &#34;,&#34; &LT;&LT; p.second&lt;&lt; &#34; } \ n&#34 ;;     }     std :: cout&lt;&lt;的std :: ENDL;     auto cmp = [](const auto&amp; p1,const auto&amp; p2)     {         return p2.second&lt; p1.second || !(p1.second&lt; p2.second)&amp;&amp; p1.first&lt; p2.first;     };     std :: set&lt; std :: pair&lt; char,size_t&gt;,decltype(cmp)&gt; s(m.begin(),m.end(),cmp);     for(const auto&amp; p:s)     {         std :: cout&lt;&lt; &#34; {&#34; &LT;&LT; p.first&lt;&lt; &#34;,&#34; &LT;&LT; p.second&lt;&lt; &#34; } \ n&#34 ;;     }     std :: cout&lt;&lt;的std :: ENDL; } 程序输出是 {E,2} {H,1} {I,3} {L,2} {N,3} {O,2} {S,2} {T,1} {Y,1} {I,3} {N,3} {E,2} {L,2} {O,2} {S,2} {H,1} {T,1} {Y,1} 还要注意程序中的if而不是if-else语句 if(letters.count(toupper(input [i]))== 0) {     字母[toupper(input [i])] = 1; } 其他 {     字母[toupper(input [i])] + = 1; } 你可以写 ++字母[在toupper(输入[I])];