zoukankan      html  css  js  c++  java
  • C++对一组pair数据进行排序(sort函数的使用)

    最近在写一个算法的时候,把一些数据存在了pair中,并且需要根据pair中first或者second的值对这些数据进行排序。比如:输入数据(1,2)、(4,2)、(3,3)、(2,1)根据first的值大小进行升序排序,输出(1,2)、(2,1)、(3,3)、(4,2)。
    经过思索之后得到的实现方法如下:
    首先将这些数据存在vector数组中,vector<pair<int,int>>vec;
    然后使用sort函数对数组进行排序,这里就涉及到了sort函数的使用了。
    下面是sort函数使用方法
    函数声明:

    template <class RandomAccessIterator>
      void stable_sort ( RandomAccessIterator first, RandomAccessIterator last );
    
    template <class RandomAccessIterator, class Compare>
      void stable_sort ( RandomAccessIterator first, RandomAccessIterator last,
                         Compare comp );

    参数解释:
    (1)第一个是要排序的数组的起始地址。
    (2)第二个是结束的地址(最后一位要排序的地址的下一地址)。
    (3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。
    我们可以根据自己的需求自定义第三个参数cmp函数,比如若要对整型数组降序排序,则可以这样来写cmp函数:

    bool cmp(int a, int b)
    {
        return a>b;//升序则为a<b
    }

    这个cmp参数使用起来非常方便,因为它正好能解决我们的pair排序问题。
    我们只要根据数组中的元素类型定义cmp函数的参数,并且根据需求定义函数体

    bool cmp(pair<int, int>a, pair<int, int>b)
    {
        return a.first<b.first;//根据fisrt的值升序排序
        //return a.second<b.second;//根据second的值升序排序
    }

    然后调用sort函数sort(vec.begin(),vec.end(),cmp)。
    便可以根据pair中first的值进行升序排序。

    下面是具体代码实现

    #include "stdafx.h"
    #include <iostream>
    #include <vector>
    #include<algorithm>
    
    using namespace std;
    
    //根据first的值升序排序
    bool cmp1(pair<int,int>a,pair<int,int>b)
    {
        return a.first < b.first;
    }
    
    //根据second的值升序排序
    bool cmp2(pair<int, int>a, pair<int, int>b)
    {
        return a.second < b.second;
    }
    int main()
    {
        vector<pair<int, int>>vec;
        vec.push_back({ 1,2 });
        vec.push_back({ 4,2 });
        vec.push_back({ 3,3 });
        vec.push_back({ 2,1 });
        sort(vec.begin(), vec.end(), cmp1);
        cout << "根据first的值升序排序:" << endl;
        for (auto it = vec.begin();it != vec.end();it++)
        {
            cout << "(" << it->first << "," << it->second << ")" << endl;
        }
        sort(vec.begin(), vec.end(), cmp2);
        cout << "根据second的值升序排序:" << endl;
        for (auto it = vec.begin();it != vec.end();it++)
        {
            cout << "(" << it->first << "," << it->second << ")" << endl;
        }
    }

    运行截图

    作者:Hahallo
             
    本文版权归作者和博客园共有,未经作者同意不能转载,否则保留追究法律责任的权利。
  • 相关阅读:
    当我们谈线(进)程“切换”时
    机器学习算法实现——线性回归
    从cpu加电到加载OS内核的详细过程(清华大学ucore-lab1总结一)
    X86 I/O端口
    【转】实模式和保护模式
    链接器(linker)的作用——CSAPP第7章读书笔记
    【转】Derivation of the Normal Equation for linear regression
    使用PowerShell创建Active Directory用户对象(域用户)
    使用Powershell安装WSFC
    临时自定义数学算符添加正下方下标
  • 原文地址:https://www.cnblogs.com/bigyang/p/8590552.html
Copyright © 2011-2022 走看看