我想按整数按降序对地图进行排序,但是如果值相等,我想按字符串进行排序。我在对地图进行排序的代码中,然后将前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>>')
答案 0 :(得分:2)
这是行得通的,当您获得排序结果时,只应循环遍历“ setOfWords”而不是“ m”。
CMAKE_PREFIX_PATH
答案 1 :(得分:0)
按 thing1 然后 thing2 然后...进行比较的一种简单方法是使用std::tuple
's operator <
和std::tie
通过参考
using Item = std::pair<std::string, int>;
auto cmp = [](const Item & lhs, const Item & rhs)
{
return std::tie(lhs.second, lhs.first) < std::tie(rhs.second, rhs.first);
}