【发布时间】:2019-03-10 15:09:06
【问题描述】:
我想按整数对地图进行降序排序,但如果值相等,我想按字符串排序。我有这段代码,我在其中对地图进行排序,然后将前 k 个值写入向量:
map<string, int> m;
vector<string> calc(int k) {
typedef std::function<bool(std::pair<std::string, int>, std::pair<std::string, int>)> Comparator;
Comparator compFunctor =
[](std::pair<std::string, int> p1 ,std::pair<std::string, int> p2)
{
if(p1.second != p2.second){
return p1.second > p2.second;
}else{
return p1.first > p2.first;
}
};
std::set<std::pair<std::string, int>, Comparator> setOfWords(m.begin(), m.end(), compFunctor);
int c = 0;
vector<string> str;
for(auto it = m.begin(); it != m.end(); it++){
if(c >= k){
break;
}
str.push_back(it->first);
c += 1;
}
for(int i = 0; i<str.size(); i++){
cout << str[i] << " ";
}
return str;
}
};
但是,它没有排序。
auto cmp = [](std::pair<int,string> const & p1, std::pair<int,string> const & p2)
{
if(p1.second != p2.second){
return p2.second > p1.second;
// }
// return true;
}else{
return p2.first > p1.first;
}
};
std::sort(m.begin(), m.end(), cmp);
我也试过了,但它甚至没有编译。它给了我二进制表达式的无效操作数('std::__1::__map_iterator, int>, std::__1::__tree_node, int>, void *> *, long> >' 和 'std::__1::__map_iterator , int>, std::__1::__tree_node, int>, void *> *, long> >')
【问题讨论】:
-
您有一个
std::map<string, int>,但您的cmp函数比较std::pair<int, string>。你的意思是std::pair<string, int>? -
std::map 是排序容器,你说的排序是什么意思?
-
jamesdlin 哦,对不起,反之亦然
-
Öö Tiib 所以我应该使用无序地图吗?
-
您不对地图进行排序。这没有道理。地图中元素的顺序是固定的,不能更改。无序映射中元素的顺序是不确定的,但仍然无法更改。
标签: c++ sorting dictionary