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;
}
原文地址:https://www.cnblogs.com/eilearn/p/9462236.html