我正在尝试使用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;
}
答案 0 :(得分:15)
从编译和逻辑的角度来看,这是不可能的。从类型的角度来看,std::sort
要求:
-RandomIt必须满足ValueSwappable和RandomAccessIterator的要求 - 解除引用的RandomIt类型必须满足MoveAssignable和MoveConstructible的要求。
std::unordered_map
上的迭代器类型是ForwardIterator,而不是RandomAccessIterator,因此第一个要求不满足。取消引用的迭代器的类型是pair<const Key, T>
,它不是MoveAssignable(不能分配给const
),因此第二个要求也不满意。
从逻辑角度来看,排序无序容器毫无意义。这是无序的。而且unordered_map
能够实现的复杂性保证需要一个非常具体的顺序,你不应该这样做,而且也不允许这样做。
如果你想&#34;排序&#34;您的unordered_map
,将其放入vector
:
std::vector<std::pair<char, int>> elems(table.begin(), table.end());
std::sort(elems.begin(), elems.end(), comp);