使用sort()对unordered_map进行排序

pra*_*aha 8 c++ unordered-map

我试图对unordered_map使用sort()函数进行排序,但我不断收到编译器错误.有人可以帮忙吗?

bool comp(pair<char,int> a, pair<char,int> b) {
    return a.second < b.second;
}

void rearrangeKDist(char str[], int d) {
    int n = strlen(str);
    unordered_map<char, int> table;
    for (int i=0; i<n; i++) {
        unordered_map<char, int>::iterator it = table.find(str[i]);   
        if (it == table.end()) {
            table.insert(make_pair(str[i], 1));
        } else {
            it->second = it->second+1;
        }
    }
    for (unordered_map<char, int>::iterator it=table.begin(); it!=table.end(); it++)
        cout<<it->first<<" "<<it->second<<endl;
    sort(table.begin(), table.end(), comp);
    for (unordered_map<char, int>::iterator it=table.begin(); it!=table.end(); it++)
        cout<<it->first<<" "<<it->second<<endl;

}
Run Code Online (Sandbox Code Playgroud)

Bar*_*rry 21

从编译和逻辑的角度来看,这是不可能的.从类型的角度来看,std::sort要求:

-RandomIt必须满足ValueSwappable和RandomAccessIterator的要求.
- 解除引用的RandomIt类型必须满足MoveAssignable和MoveConstructible的要求.

迭代器类型std::unordered_map是一个ForwardIterator,而不是RandomAccessIterator,因此第一个要求是不满足的.取消引用的迭代器的类型是pair<const Key, T>,不是MoveAssignable(不能赋值const),因此第二个要求也不满足.

从逻辑的角度来看,对无序容器进行排序是没有意义的.这是无序的.并且unordered_map能够实现的复杂性保证需要一个非常特定的顺序,你不应该,也不是,不允许这样做.

如果你想"排序"你的unordered_map,把它们放在vector:

std::vector<std::pair<char, int>> elems(table.begin(), table.end());
std::sort(elems.begin(), elems.end(), comp);
Run Code Online (Sandbox Code Playgroud)

  • 对于`std::sort`,我们需要:`#include &lt;algorithm&gt;` (4认同)
  • 嗨,感谢您的回答,我真的很喜欢第一个原因的解释方式。我正处于从新手到中间人的过渡阶段,您能否就应该查看哪些资源提出一些建议,以便我们可以像您在这里所做的那样以更扎实的方式解释问题?@Barry (2认同)