C++(十二)— vector中pair的排序方法
1、利用自定义的排序函数
通过传递一个函数 cmp给sort函数 , 注意: cmp中return a<b; 决定为从小到大的排序
return a>b; 决定为从大到小的排序
#include<iostream> #include<algorithm> #include<stdio.h> #include <vector> #include<string> using namespace std; bool cmp(const pair<int, char> a, const pair<int, char> b) { return a.first<b.first;//自定义的比较函数 } int main() { vector<pair<int, char>> p; p.push_back(make_pair(10, 'a')); p.push_back(make_pair(9, 'c')); p.push_back(make_pair(10, 't')); p.push_back(make_pair(17, 'y')); p.push_back(make_pair(10, 'b')); sort(p.begin(), p.end(), cmp);//按照第一个元素排序 for (auto i = 0; i<p.size(); i++) cout << p[i].first << " " << p[i].second << endl; system("pause"); return 0; }
2、自定义字符串的排序函数
(1)排序的比较方式,长度相同则字母排序,否则长度排序
在函数中定义时不用将比较函数定义为静态成员函数。
//排序的比较方式,长度相同则字母排序,否则长度排序 bool compare( string s1, string s2) { if (s1.size() == s2.size()) return s1 < s2; else if (s1.size() < s2.size()) return true; return false; }
(2)字符串数组排成最小的数
在c++类中自定义比较函数时,需注意类中比较函数声明为静态成员函数。
static bool compare(const string& a,const string& b) { string s1 = a+b; string s2 = b+a; return s1<s2; }
3、举例:调整塔的高度
给出塔的数量n和调整最大次数k,以及每个塔的高度,在有限次数内调整塔的高度,使最大塔差最小。
输入:3 2
5 8 5
输出:0 2
2 1
2 3
使用pair结构保存数据。
#include<iostream> #include<algorithm> #include<stdio.h> #include <vector> #include<string> #include<map> using namespace std; bool cmp(pair<int, int>& a, pair<int, int>& b) { // 开始没写这个 if,卡在 20% ,加上100% // 减的时候,先拿编号大的;加的时候,先拿编号小的 if (a.second == b.second) { return a.first > b.first; } return a.second > b.second; } int main() { int n, k; while (cin >> n >> k) { vector<pair<int, int>> nums; vector<pair<int, int>> res; for (int i = 0; i < n; ++i) { int temp; cin >> temp; nums.push_back(make_pair(i + 1, temp)); } for (int i = 0; i < k; ++i) { sort(nums.begin(), nums.end(), cmp); if (nums[0].second - nums[n - 1].second <= 1) break; nums[0].second--; nums[n - 1].second++; res.push_back(make_pair(nums[0].first, nums[n - 1].first)); } sort(nums.begin(), nums.end(), cmp); cout << nums[0].second - nums[n - 1].second << " " << res.size() << endl; for (int i = 0; i < res.size(); ++i) { cout << res[i].first << " " << res[i].second << endl; } } system("pause"); return 0; }