sort函数对结构体|pair对组|vector容器|map排序|二维数组的第x列 的排序

news2024/11/14 13:51:07

目录

sort对 vector容器

sort对 vector<pair<int,int>>对组

sort对 结构体

结构体外部规定排序 

结构体内部运算符重载

map容器的排序

map的键排序

map的值排序

sort对二维数组的排序


 

sort对 vector容器

sort()函数可以用于对vector容器进行排序。具体来说,sort()函数可以接受一个表示容器的迭代器范围作为参数,然后对该范围内的元素进行排序。在排序时,我们需要传入一个比较函数,用于告诉sort()函数如何比较元素。 下面是一个示例代码,演示如何使用sort()函数对vector容器进行排序:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
    vector<int> nums = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    sort(nums.begin(), nums.end()); // 默认升序排序
    for(auto num : nums) {
        cout << num << " ";
    }
    cout << endl;
    sort(nums.begin(), nums.end(), greater<int>()); // 降序排序
    for(auto num : nums) {
        cout << num << " ";
    }
    cout << endl;
    return 0;
}

输出结果为:

1 1 2 3 3 4 5 5 5 6 9 
9 6 5 5 5 4 3 3 2 1 1 

在上面的代码中,我们创建了一个名为numsvector容器,并初始化了一些整数值。然后,我们先调用了一次sort()函数,对容器中的元素进行升序排序,并使用一个循环打印出排序后的结果。接着,我们又调用了一次sort()函数,并传入了一个比较函数greater<int>(),用于告诉sort()函数按照降序排序。最后,我们再次使用一个循环打印出排序后的结果。 需要注意的是,sort()函数会修改容器中的元素顺序,因此在排序前最好将容器备份一下,以免意外修改到原有数据。

sort对 vector<pair<int, int>>排序

要对vector<pair<int,int>>的第二个元素进行排序,可以使用sort()函数来实现。使用sort()函数需要传入三个参数,第一个参数是要排序的起始位置,第二个参数是要排序的结束位置,第三个参数是一个函数指针,用于指定排序的规则。 下面是一个示例代码,演示如何对vector<pair<int,int>>的第二个元素进行升序排序:

//对第二元素排序
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool cmp(const pair<int, int>& a, const pair<int, int>& b) {
    return a.second < b.second;
}
int main() {
    vector<pair<int, int>> v = {{1, 4}, {2, 2}, {3, 5}, {4, 1}, {5, 3}};
    
    sort(v.begin(), v.end(), cmp);
    
    for(auto p : v) {
        cout << p.first << " " << p.second << endl;
    }
    
    return 0;
}

输出结果:

4 1
2 2
5 3
1 4
3 5

在上面的代码中,我们定义了一个比较函数cmp(),用于指定排序规则。这个函数接受两个参数,都是pair<int,int>类型的引用。它会比较这两个pair的第二个元素,如果第一个pair的第二个元素小于第二个pair的第二个元素,就返回true,否则返回false。 然后,在main()函数中,我们创建了一个vector<pair<int,int>>类型的变量v,并初始化了一些值。然后,我们调用sort()函数对v进行排序。最后,我们使用一个循环打印出排序后的结果。 

 

 值得注意的是,如果是对第一个元素进行排序,则不需要cmp函数,因为sort默认对第一个元素排序

//对第一元素排序
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
//bool cmp(const pair<int, int>& a, const pair<int, int>& b) {
//    return a.second < b.second;
//}
int main() {
    vector<pair<int, int>> v = { {1, 4}, {2, 2}, {3, 5}, {4, 1}, {5, 3} };

    sort(v.begin(), v.end());

    for (auto p : v) {
        cout << p.first << " " << p.second << endl;
    }

    return 0;
}

输出:

1 4
2 2
3 5
4 1
5 3

 

sort对 结构体

结构体外部规定排序 

对结构体排序和对vector的排序类似,也是使用sort()函数来实现。不同之处在于,需要指定一个比较函数来告诉sort()函数如何比较结构体对象。 下面是一个示例代码,演示如何对一个包含多个字段的结构体进行排序:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct Person {
    string name;
    int age;
    double salary;
};
bool cmpAge(const Person& p1, const Person& p2) {
    return p1.age < p2.age; // 按照年龄升序排序
}
bool cmpSalary(const Person& p1, const Person& p2) {
    return p1.salary > p2.salary; // 按照工资降序排序
}
int main() {
    vector<Person> people = {
        {"Alice", 25, 4000.0},
        {"Bob", 30, 5000.0},
        {"Charlie", 20, 3000.0},
        {"David", 35, 6000.0},
    };
    
    sort(people.begin(), people.end(), cmpAge);
    cout << "按照年龄升序排序:" << endl;
    for(auto p : people) {
        cout << p.name << " " << p.age << " " << p.salary << endl;
    }
    
    sort(people.begin(), people.end(), cmpSalary);
    cout << "按照工资降序排序:" << endl;
    for(auto p : people) {
        cout << p.name << " " << p.age << " " << p.salary << endl;
    }
    
    return 0;
}

输出结果为:

按照年龄升序排序:
Charlie 20 3000
Alice 25 4000
Bob 30 5000
David 35 6000
按照工资降序排序:
David 35 6000
Bob 30 5000
Alice 25 4000
Charlie 20 3000

在上面的代码中,我们定义了一个名为Person的结构体,其中包含了姓名、年龄和工资三个字段。然后,我们又定义了两个比较函数cmpAge()cmpSalary(),分别用于按照年龄升序和按照工资降序排序。 在main()函数中,我们创建了一个包含四个Person对象的vector,并初始化了一些值。然后,我们分别调用了两次sort()函数,分别按照年龄升序和按照工资降序排序。最后,我们使用两个循环分别打印出排序后的结果。

结构体内部运算符重载

在结构体内重载运算符,可以使我们更方便地对结构体进行排序。在C++中,可以通过重载小于号运算符<来实现结构体的排序。具体来说,如果我们想要按照某个字段升序排序,只需要在结构体中定义一个小于号运算符的重载函数,然后在排序时传入该函数即可。 下面是一个示例代码,演示如何在结构体内重载小于号运算符,并用sort()函数对该结构体进行排序:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct Person {
    string name;
    int age;
    double salary;
    bool operator < (const Person& other) const {
        return age < other.age; // 按照年龄升序排序
    }
};
int main() {
    vector<Person> people = {
        {"Alice", 25, 4000.0},
        {"Bob", 30, 5000.0},
        {"Charlie", 20, 3000.0},
        {"David", 35, 6000.0},
    };
    
    sort(people.begin(), people.end());
    
    for(auto p : people) {
        cout << p.name << " " << p.age << " " << p.salary << endl;
    }
    
    return 0;
}

输出结果为:

Charlie 20 3000
Alice 25 4000
Bob 30 5000
David 35 6000

在上面的代码中,我们在Person结构体中重载了小于号运算符<,使其按照年龄升序排序。在main()函数中,我们创建了一个包含四个Person对象的vector,并初始化了一些值。然后,我们调用了一次sort()函数,传入了一个空的比较函数,因为我们已经在Person结构体内重载了小于号运算符。最后,我们使用一个循环打印出排序后的结果。 需要注意的是,重载小于号运算符时,需要将运算符重载函数声明为const成员函数,这是因为排序函数需要保证比较操作不会修改结构体的内容。

map容器的排序

map的键排序

map容器本身是有序的,因此不需要使用sort()函数对其进行排序。map容器是一种关联容器,其中的元素是按照键值有序排列的,因此我们可以说map容器本身就已经是排序好的了。 如果我们需要对map容器进行遍历,可以使用迭代器来访问其中的元素。map容器的迭代器按照键值升序排列,因此我们可以直接使用一个循环来遍历map容器中的所有元素。 下面是一个示例代码,演示如何使用迭代器遍历map容器:

#include <iostream>
#include <map>
using namespace std;
int main() {
    map<string, int> scores = {
        {"Alice", 80},
        {"Bob", 70},
        {"Charlie", 90},
        {"David", 85},
    };
    
    for(auto it = scores.begin(); it != scores.end(); ++it) {
        cout << it->first << ": " << it->second << endl;
    }
    
    return 0;
}

输出结果为:

Alice: 80
Bob: 70
Charlie: 90
David: 85

在上面的代码中,我们创建了一个名为scoresmap容器,并初始化了一些键值对。然后,我们使用一个迭代器it遍历map容器中的所有元素,并打印出每个键值对的键和值。 需要注意的是,map容器的键和值是一一对应的,因此在遍历map容器时,需要使用迭代器的firstsecond成员来访问键和值。在上面的代码中,it->first代表当前迭代器指向的键,it->second代表当前迭代器指向的值。

map的值排序

map容器中的元素是按照键值有序排列的,因此无法直接使用sort()函数对其值进行排序。但是,我们可以将map容器中的键值对复制到一个vector容器中,然后对vector容器中的元素进行排序,最后再将排序后的结果更新到map容器中。 下面是一个示例代码,演示如何使用vector容器对map容器中的值进行排序:

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
    map<string, int> scores = {
        {"Alice", 80},
        {"Bob", 70},
        {"Charlie", 90},
        {"David", 85},
    };
    
    vector<pair<string, int>> vec;
    for(auto it = scores.begin(); it != scores.end(); ++it) {
        vec.push_back(*it);
    }
    
    sort(vec.begin(), vec.end(), [](pair<string, int>& a, pair<string, int>& b){
        return a.second > b.second; // 按值降序排列
    });
    
    scores.clear();
    for(auto& p : vec) {
        scores.insert(p);
    }
    
    for(auto it = scores.begin(); it != scores.end(); ++it) {
        cout << it->first << ": " << it->second << endl;
    }
    
    return 0;
}

输出结果为:

Charlie: 90
David: 85
Alice: 80
Bob: 70

在上面的代码中,我们首先创建了一个名为scoresmap容器,并初始化了一些键值对。然后,我们创建了一个vector容器vec,并使用循环将scores中的键值对复制到vec中。接着,我们调用了sort()函数并传入一个比较函数,用于按照值降序排列vec中的元素。由于vec中的元素是键值对,因此我们需要在比较函数中指定按照second成员排序。最后,我们清空了scores容器,再使用循环将排序后的键值对插入到scores容器中,并使用迭代器遍历scores容器,打印出每个键值对的键和值。 需要注意的是,在将排序后的键值对插入到map容器中时,我们使用了insert()函数,而不是直接使用=赋值运算符。这是因为map容器中的元素是按照键值有序排列的,因此如果我们直接使用=赋值运算符,可能会破坏原有的顺序关系。而使用insert()函数可以保证插入的新元素仍然按照键值有序排列。

sort对二维数组的排序

二维数组可以看作是一个包含若干个一维数组的数组,因此可以使用sort()函数对其进行排序。但是,需要注意的是,在使用sort()函数对二维数组排序时,需要自定义比较函数,以指定按照哪个元素进行排序。 下面是一个示例代码,演示如何使用sort()函数对二维数组进行排序:

#include <iostream>
#include <algorithm>
using namespace std;
int main() {
    int a[][3] = {
        {3, 1, 4},
        {2, 8, 5},
        {9, 7, 6},
    };
    int n = sizeof(a) / sizeof(a[0]); // 行数
    int m = sizeof(a[0]) / sizeof(int); // 列数
    
    sort(a, a + n, [](int* x, int* y){
        return x[1] < y[1]; // 按第二列升序排列
    });
    
    for(int i = 0; i < n; ++i) {
        for(int j = 0; j < m; ++j) {
            cout << a[i][j] << ' ';
        }
        cout << endl;
    }
    
    return 0;
}

输出结果为:

3 1 4 
9 7 6 
2 8 5 

在上面的代码中,我们定义了一个名为a的二维数组,其中包含了三个一维数组,每个一维数组有三个元素。然后,我们使用sizeof()运算符计算出了行数和列数,并调用了sort()函数,并传入一个比较函数,用于按照第二列升序排列二维数组中的元素。由于sort()函数对于二维数组的排序需要在比较函数中指定按照哪个元素排序,因此我们在比较函数中指定了按照第二列排序。最后,我们使用两个嵌套循环遍历二维数组,并打印出每个元素的值。 需要注意的是,在比较函数中,我们使用了指针来表示二维数组中的一维数组。这是因为二维数组在传递给函数时,会自动转换为指向其第一行的指针,因此在比较函数中可以直接使用指针来表示一维数组。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/393469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java基础学习 day49(JDK8的接口新特性,JDK9的新特性,接口的应用场景)

JDK8以后&#xff0c;接口中新增的默认方法 允许在接口中定义默认方法&#xff0c;需要使用关键字default修饰&#xff0c;作用为&#xff0c;解决接口升级时&#xff0c;需要强制修改所有实现类的问题接口中默认方法的定义格式&#xff1a; a. 格式&#xff1a; public defau…

【黄河流域公安院校网络空间安全技能挑战赛】部分wp

文章目录webbabyPHPfunnyPHPEzphp**遍历文件目录的类**1、DirectoryIterator&#xff1a;2、FilesystemIterator:3、**Globlterator**读取文件内容的类&#xff1a;SplFileObjectMisc套娃web babyPHP <?php highlight_file(__FILE__); error_reporting(0);$num $_GET[nu…

排序模型:DIN、DINE、DSIN

目录 DIN 输入 输出&#xff1a; 与transformer注意力机制的区别与联系&#xff1a; DINE 改善DIN 输入&#xff1a; DSIN 动机&#xff1a; DIN 适用与精排&#xff0c;论文&#xff1a; Deep Interest Network for Click-Through Rate Prediction DIN模型提出的动…

蓝桥web基础知识学习

HTMLCSS 知识点重要指数HTML 基础标签&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;HTML5 新特性&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;HTML5 本地存储&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;CSS 基础语法…

Java中方法引用(引用静态方法、引用成员方法(引用其他类的成员方法、引用本类的成员方法、引用父类的成员方法)、引用构造方法、其他调用方式、小练习)

方法引用&#xff1a;把已经存在的方法拿过来用&#xff0c;当作函数式接口中抽象方法的方法体 我们前面学到Arrays工具类中的sort方法&#xff0c;当我们需要指定排序规则时&#xff0c;需要传递Comparator接口的实现类对象&#xff0c;我们之前使用匿名内部类类的形式作为参…

下一个元宇宙热点?探讨元宇宙婚礼的未来趋势

欢迎来到Hubbleverse &#x1f30d; 关注我们 关注宇宙新鲜事 &#x1f4cc; 预计阅读时长&#xff1a;7分钟 本文仅代表作者个人观点&#xff0c;不代表平台意见&#xff0c;不构成投资建议。 专家认为&#xff0c;在不久的将来&#xff0c;传统婚礼和元宇宙婚礼有可能共存…

taobao.item.barcode.update( 更新商品条形码信息 )

&#xffe5;免费必须用户授权 通过该接口&#xff0c;将商品以及SKU上得条形码信息补全 公共参数 请求地址: HTTP地址 http://gw.api.taobao.com/router/rest 公共请求参数: 公共响应参数: 请求参数 响应参数 点击获取key和secret 请求示例 TaobaoClient client new Def…

【Spring】资源操作管理:Resource、ResourceLoader、ResourceLoaderAware;

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 资源操作&#xff1a;Spring Resources一、Res…

智能家居创意产品一Homkit智能通断器

智能通断器&#xff0c;也叫开关模块&#xff0c;可以非常方便地接入家中原有开关、插座、灯具、电器的线路中&#xff0c;通过手机App或者语音即可控制电路通断&#xff0c;轻松实现原有家居设备的智能化改造。 随着智能家居概念的普及&#xff0c;越来越多的人想将自己的家改…

Pytest自动化测试框架-权威教程06-使用Marks标记测试用例

使用Marks标记测试用例通过使用pytest.mark你可以轻松地在测试用例上设置元数据。例如, 一些常用的内置标记&#xff1a;skip - 始终跳过该测试用例skipif - 遇到特定情况跳过该测试用例xfail - 遇到特定情况,产生一个“期望失败”输出parametrize - 在同一个测试用例上运行多次…

自旋锁,读写锁以及他们的异同

自旋锁 自旋锁是一种用于多线程编程的同步机制。它是一种基于忙等待的锁&#xff0c;当线程尝试获取锁时&#xff0c;如果锁已被其他线程占用&#xff0c;则该线程会一直循环检查锁是否被释放&#xff0c;直到获取到锁为止。 在自旋锁的实现中&#xff0c;使用了CPU的硬件特性…

ArcGIS制图之阴影效果的表达与运用

一、运用制图表达进行投影表达 在专题图的制作过程中&#xff0c;经常需要将目标区域从底图中进行突显&#xff0c;运用制图表达制作图层投影可以较好地实现这一目的。具体步骤如下&#xff1a; 1.将目标图层存储于数据库中并加载至窗口&#xff08;shapefile格式数据无法支持…

Android Looper简介

本文基于安卓11。 Looper是一个用具&#xff0c;在安卓程序中&#xff0c;UI线程是由事件驱动的&#xff08;onCreate, onResume, onDestory&#xff09;&#xff0c;Looper就是处理这些事件的工具&#xff0c;事件被描述为消息&#xff08;Message&#xff09;&#xff0c;Lo…

【PHP代码注入】PHP代码注入漏洞

漏洞原理RCE为两种漏洞的缩写&#xff0c;分别为Remote Command/Code Execute&#xff0c;远程命令/代码执行PHP代码注入也叫PHP代码执行(Code Execute)(Web方面)&#xff0c;是指应用程序过滤不严&#xff0c;用户可以通过HTTP请求将代码注入到应用中执行。代码注入(代码执行)…

python甜橙歌曲音乐网站平台源码

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;python音乐 获取完整源码源文件说明文档配置教程等 在虚拟环境下输入命令“python manage.py runserver”启动项目&#xff0c;启动成功后&#xff0c;访问“http://127.0.0.1:5000”进入甜橙音乐网首页&#xff0c;如图1所…

YOLOS调试记录

YOLOS是由华中科大提出的将Transformer迁移到计算机视觉领域的目标检测方法&#xff0c;其直接魔改ViT&#xff01;本文首次证明&#xff0c;通过将一系列固定大小的非重叠图像块作为输入&#xff0c;可以以纯序列到序列的方式实现2D目标检测。 模型结构 下面来调试一下该项目…

【微信小程序】-- 页面事件 - 上拉触底 - 案例(二十七)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

javaScript基础面试题 ---对象考点

1、对象是通过new操作符构建出来的&#xff0c;所以对象之间不相等 2、对象注意引用类型&#xff0c;如果是引用类型&#xff0c;就可能会相等 3、现在对象本身查找 -> 构造函数中找 -> 对象原型中找 -> 构造函数原型中找 -> 对象上一层原型… 1、对象是通过new操作…

被骗进一个很隐蔽的外包公司,入职一个月才发现,已经有了社保记录,简历污了,以后面试有影响吗?...

职场的套路防不胜防&#xff0c;一不留神就会掉坑&#xff0c;一位网友就被“骗”进了外包公司&#xff0c;他说公司非常隐蔽&#xff0c;入职一个月才发现是外包&#xff0c;但已经有了社保记录&#xff0c;简历污了&#xff0c;不知道对以后面试有影响吗&#xff1f;楼主说&a…

Mysql迁移Postgresql

目录原理环境准备操作系统(Centos7)Mysql客户端安装Psql客户端安装数据库用户导表脚本dbmysql2pgmysqlcopy测试在mysql中建表导表测试查看pg中的表原理 Mysql抽取&#xff1a;mysql命令重定向到操作系统文件&#xff0c;处理成csv文件&#xff1b; PG装载&#xff1a;copy方式…