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");
return0;
}
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(), d(), 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(), d(), 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");
return0;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。