关于C++中vector和set使用sort方法进行排序

C++中vector和set都是非常方便的容器,

sort方法是algorithm头文件里的一个标准函数,能进行高效的排序,默认是按元素从小到大排序

将sort方法用到vector和set中能实现多种符合自己需求的排序

首先sort方法可以对静态的数组进行排序

1 #include<iostream>
2 using namespace std;
3 int main(){
4     int a[10] = { 9, 0, 1, 2, 3, 7, 4, 5, 100, 10 };
5     sort(a, a +10);
6     for (int i = 0; i < 10; i++)
7         cout << a[i] << endl;
8     return 0;
9 }

运行结果:

这里可以看到是sort(a,a+10),但是数组a一共只有9个元素,为什么是a+10而不是a+9呢?

因为sort方法实际上最后一位地址对应的数是不取的,

而且vector,set,map这些容器的end()取出来的值实际上并不是最后一个值,而end的前一个才是最后一个值!

需要用prev(xxx.end()),才能取出容器中最后一个元素。

对vector使用sort函数:

第一种情形:基本类型,如vector<int>,vector<double>,vector<string>也是可以的

 1 #include<iostream>
 2 #include<vector>
 3 #include<algorithm>
 4 using namespace std;
 5 int main(){
 6     vector<int> a;
 7     int n = 5;
 8     while (n--){
 9         int score;
10         cin >> score;
11         a.push_back(score);
12     }
13     //cout <<" a.end()"<< *a.end() << endl;       执行这句话会报错!
14     cout << " prev(a.end)" << *prev(a.end()) << endl;
15     sort(a.begin(), a.end());
16     for (vector<int>::iterator it = a.begin(); it != a.end(); it++){
17         cout << *it << endl;
18     }
19     return 0;
20 }

执行结果:

看到了吗,实际上end的前一个指针指向的元素才是插入时的最后一个值!

排序后从小大大。

第二种情形:用自定义的结构体进行sort算法,

这时候需要自己定义个比较函数,因为sort算法是基于容器中的元素是可以两两比较的,然后从小到大排序,所以要自定义怎么样才是小于(‘<‘)

 1 #include<iostream>
 2 #include<vector>
 3 #include<set>
 4 #include<string>
 5 #include<algorithm>
 6 using namespace std;
 7 struct student{
 8     char name[10];
 9     int score;
10 };
11 //自定义“小于”
12 bool comp(const student &a, const student &b){
13     return a.score < b.score;
14 }
15 int main(){
16     vector<student> vectorStudents;
17     int n = 5;
18     while (n--){
19         student oneStudent;
20         string name;
21         int score;
22         cin >> name >> score;
23         strcpy(oneStudent.name, name.c_str());
24         oneStudent.score = score;
25         vectorStudents.push_back(oneStudent);
26     }
27     cout << "===========排序前================" << endl;
28     for (vector<student>::iterator it = vectorStudents.begin(); it != vectorStudents.end(); it++){
29         cout << "name: " << it->name << " score: " << it->score << endl;
30     }
31     sort(vectorStudents.begin(),vectorStudents.end(),comp);
32     cout << "===========排序后================" << endl;
33     for (vector<student>::iterator it = vectorStudents.begin(); it != vectorStudents.end(); it++){
34         cout << "name: " << it->name << " score: " << it->score << endl;
35     }
36     return 0;
37 }

运行结果:

接下来,对于set做类似的操作。

set是一个集合,内部的元素不会重复,同时它会自动进行排序,也是从小到大

而且set的insert方法没有insert(a,cmp)这种重载,所以如果要把结构体插入set中,我们就要重载‘<‘运算符。

set方法在插入的时候也是从小到大的,那么我们重载一下<运算符让它从大到小排序

 1 #include<iostream>
 2 #include<vector>
 3 #include<set>
 4 #include<string>
 5 #include<algorithm>
 6 using namespace std;
 7 struct student{
 8     char name[10];
 9     int score;
10 };
11 //自定义“小于”
12 bool comp(const student &a, const student &b){
13     return a.score < b.score;
14 }
15 bool operator < (const student & stu1,const student &stu2){
16     return stu1.score > stu2.score;
17 }
18 int main(){
19     //vector<student> vectorStudents;
20     set<student> setStudents;
21     //int n = 5;
22     int n = 6;
23     while (n--){
24         student oneStudent;
25         string name;
26         int score;
27         cin >> name >> score;
28         strcpy(oneStudent.name, name.c_str());
29         oneStudent.score = score;
30         setStudents.insert(oneStudent);
31     }
32     cout << "===========排序前================" << endl;
33     for (set<student>::iterator it = setStudents.begin(); it != setStudents.end(); it++){
34         cout << "name: " << it->name << " score: " << it->score << endl;
35     }
36     //sort(setStudents.begin(), setStudents.end(), comp);
37     //cout << "===========排序后================" << endl;
38     //for (set<student>::iterator it = setStudents.begin(); it != setStudents.end(); it++){
39     //    cout << "name: " << it->name << " score: " << it->score << endl;
40     //}
41     return 0;
42 }

运行结果:

我们可以看到,set内元素不会重复,而且它按照它所认为的“从小到大”进行了排序

时间: 2024-10-12 23:29:01

关于C++中vector和set使用sort方法进行排序的相关文章

定义一个数组,并对这个数组进行动态初始化,使用sort方法进行排序后,再将数组中的元素倒置过来。

Sort方法,生序排序 package com.fs.array; import java.util.Arrays; public class ArraySort { public static void main(String[] args) { //对数值型数组进行排序 int[] a = {5,45,71,10,2,68,14,95,25,77}; Arrays.sort(a); for (int i = 0;i < a.length; i++) { System.out.print(a[

js 数组中sort方法存在的问题

chrome中测试sort方法 发现排序失效,查过资料发现,js数组的sort方法总会以第一个字符的ASCII值来进行比较排序 解决办法一:给sort方法指定一个比较函数作为参数,如下图 解决办法二:自己一个排序算法,自己造轮子 原文地址:https://www.cnblogs.com/xingguozhiming/p/8996700.html

python中sort和sorted排序的相关方法

Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列. 1)排序基础 简单的升序排序是非常容易的.只需要调用sorted()方法.它返回一个新的list,新的list的元素基于小于运算符(__lt__)来排序. >>> sorted([5, 2, 3, 1, 4]) [1, 2, 3, 4, 5] 你也可以使用list.sort()方法来排序,此时list本身将被修改.通常此方法不如sorted()方便,但

Java记录 -67- 深入剖析Collections的sort方法

Collections类可以将存储与List中的元素进行排序,可以按照针对元素的排序方法进行排序,也可以按照指定的排序类进行排序. Collections类提供了两个静态的sort方法: sort(List<T> list) sort(List<T> list, Comparator<? super T> c) 第一个方法是直接将List中的元素进行排序,排序方法需要List中存储的元素来提供,即存储的元素要是可排序的: 第二个方法除了提供要排序的List外,还需要提供

javascript 数组排序sort方法和自我实现排序方法的学习小结 by FungLeo

前言 针对一个数组进行排序,一个很常见的需求.尤其在后端.当然,前端也是有这个需求的. 当然,数组排序,是有现成的方法的.就是sort()方法. 我们先开看下这个. 标准答案,sort方法 var arr = [45,98,67,57,85,6,58,83,48,18]; console.log('原数组'); console.log(arr); console.log('sort方法从小到大排序'); console.log(arr.sort(function(a,b){return a-b}

js-2018-11-09 关于Array中的srot()方法和compare()方法

Array中的srot()方法 sort()方法是用来重排序的方法.在默认情况下,sort()方法按升序排列数组项----即最小的值位于最前面,最大的值排在最后面. 我们看看官方是怎么说的: arrayObj.srot(sortFunction) 参数 arrayObj 必选项.任意Array对象 sortFunction 可选项.是用来确定元素顺序的函数的名称.如果这个参数被省略,那么元素将按照ASCII字符串进行升序排列. 说明 sort()方法将Array对象进行适当的排序,在执行过程中并

Array 的sort()方法详解

1.数组的sort()方法排序数字(按升序) 如果要排序数字49.5.9,那么sort()方法排序的结果是49.5.9.这是因为sort()方法默认情况下是进行升序排列.从左往右一位一位比较ASCII码大小,直至比较出大小   (若其中位数不足的补零) 那么我们应该如何利用sort()方法进行排序呢? 首先我们定义一个函数: /*升序*/ function sortNumbleUp(x,y){ return x-y; } /*降序*/ function sortNumbleDown(x,y){

c++中vector的学习

根据各种做题,发现数组并不是很适用于各种情况,当涉及到内存占用的时候,数组可能就没有vector的优势了,而vector,动态数组,比较适合某些情况. 接下来看看比较基本的vector用法: 1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 5 int main() 6 { 7 int i; 8 int A[10]={9,5,8,6,4,2,3,7,0,1}; 9 vector<int> V

STL中vector,Map,Set的实现原理

vector的数据安排以及操作方式,与array非常类似,两者唯一的区别是空间运用的灵活性,array是静态空间,一旦配置了就不能改变,如果你想要大一点的空间,就必须首先配置一块新空间,然后将原来的元素一一复制进来,再把原来的空间释放给系统.但是vector是动态空间,随着元素的增加,它的内部机制会自行扩充空间以容纳新元素,因此vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必因为害怕空间不足而一开始要求一个大块头的array了,我们可以安心使用vector,随便使用多