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(, 'a'));
p.push_back(make_pair(, 'c'));
p.push_back(make_pair(, 't'));
p.push_back(make_pair(, 'y'));
p.push_back(make_pair(, 'b')); sort(p.begin(), p.end(), cmp);//按照第一个元素排序
for (auto i = ; i<p.size(); i++)
cout << p[i].first << " " << p[i].second << endl;
system("pause"); return ;
}

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 = ; i < n; ++i)
{
int temp;
cin >> temp;
nums.push_back(make_pair(i + , temp));
}
for (int i = ; i < k; ++i)
{
sort(nums.begin(), nums.end(), cmp);
if (nums[].second - nums[n - ].second <= )
break;
nums[].second--;
nums[n - ].second++;
res.push_back(make_pair(nums[].first, nums[n - ].first));
}
sort(nums.begin(), nums.end(), cmp);
cout << nums[].second - nums[n - ].second << " " << res.size() << endl;
for (int i = ; i < res.size(); ++i)
{
cout << res[i].first << " " << res[i].second << endl;
}
} system("pause");
return ;
}
上一篇:python学习7—函数定义、参数、递归、作用域、匿名函数以及函数式编程


下一篇:剑指Offer编程题1——二维数组中的查找