根据值和键对键值对进行排序
sorting a key-value pair according to values as well as keys
PS 位于以下几行:
报告 sheet 包含 subject --------- marks
。
根据分数降序对报告进行排序,
如果 2 个科目具有相同的标记,则按照科目对这 2 行进行排序,即名称在词典顺序中首先出现的科目在最上面。
什么是解决这个 PS 的好方法?
This 帮助不大
我最初试图覆盖 std::map。然而,试图提供帮助的人指出,这不是一个好主意。这是我的方法,这也让我对实际分配值的位置感到困惑:
class map : public std::map<std::string, long, std::greater<>> {
public:
bool insert(std::pair<std::string, long> pair) {
//where do I actually "put" the values??
}
};
我尝试使用
typedef std::function<bool(std::pair<std::string, long>, std::pair<std::string, long>)> compareFunc;
compareFunc compare = [](std::pair<std::string, long> lmark, std::pair<std::string, long> rmarks) {
if (lmarks.second > rmarks.second)
return true;
else if ((lmarks.second == rmarks.second) && (lmarks.first < rmarks.first))
return true;
return false;
};
std::set<std::pair<std::string, long>, compareFunc> marks;
但它在 运行 时失败了
请给我推荐一个更好的
HackerEarth上有一个类似的问题,我是这样解决的:
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<std::pair<std::string, long>> hotels;
long n = 0;
std::cin >> n;
while (n--) {
std::pair<std::string, long> hotel;
std::cin >> hotel.first >> hotel.second;
hotels.push_back(hotel);
}
std::sort(hotels.begin(), hotels.end(), [](std::pair<std::string, long> lhotel, std::pair<std::string, long> rhotel)->bool {
if (lhotel.second > rhotel.second)
return true;
else if ((lhotel.second == rhotel.second) && (lhotel.first < rhotel.first))
return true;
return false;
});
std::cout << hotels.front().first;
return 0;
}
在您的解决方案中,只需使用 vector 而不是 set 就可以了:)
仅供将来参考,如果你想偏离标准实现
c++ 中的任何 STL 容器,总是选择向量。永远不会失败 ;)
PS 位于以下几行:
报告 sheet 包含 subject --------- marks
。
根据分数降序对报告进行排序,
如果 2 个科目具有相同的标记,则按照科目对这 2 行进行排序,即名称在词典顺序中首先出现的科目在最上面。
什么是解决这个 PS 的好方法?
This 帮助不大
我最初试图覆盖 std::map。然而,试图提供帮助的人指出,这不是一个好主意。这是我的方法,这也让我对实际分配值的位置感到困惑:
class map : public std::map<std::string, long, std::greater<>> {
public:
bool insert(std::pair<std::string, long> pair) {
//where do I actually "put" the values??
}
};
我尝试使用
typedef std::function<bool(std::pair<std::string, long>, std::pair<std::string, long>)> compareFunc;
compareFunc compare = [](std::pair<std::string, long> lmark, std::pair<std::string, long> rmarks) {
if (lmarks.second > rmarks.second)
return true;
else if ((lmarks.second == rmarks.second) && (lmarks.first < rmarks.first))
return true;
return false;
};
std::set<std::pair<std::string, long>, compareFunc> marks;
但它在 运行 时失败了
请给我推荐一个更好的
HackerEarth上有一个类似的问题,我是这样解决的:
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<std::pair<std::string, long>> hotels;
long n = 0;
std::cin >> n;
while (n--) {
std::pair<std::string, long> hotel;
std::cin >> hotel.first >> hotel.second;
hotels.push_back(hotel);
}
std::sort(hotels.begin(), hotels.end(), [](std::pair<std::string, long> lhotel, std::pair<std::string, long> rhotel)->bool {
if (lhotel.second > rhotel.second)
return true;
else if ((lhotel.second == rhotel.second) && (lhotel.first < rhotel.first))
return true;
return false;
});
std::cout << hotels.front().first;
return 0;
}
在您的解决方案中,只需使用 vector 而不是 set 就可以了:)
仅供将来参考,如果你想偏离标准实现 c++ 中的任何 STL 容器,总是选择向量。永远不会失败 ;)