C++ sort排序之降序、升序使用总结

 更新时间:2020年11月29日 00:42:45   作者:十觞亦不醉  
这篇文章主要介绍了C++ sort 排序(降序、升序)使用总结,需要的朋友可以参考下

一、升序

C++ sort 函数十分方便,可以对内置类型也可对自定义类型进行快速排序,内置类型的使用比较简单,下面主要讨论自定义类型的排序,一般有如下几种使用方法:

1.1 重载比较操作符

比如,我们现有一批学生,要根据他们的成绩进行升序排序,成绩如果相等则根据名字升序排序,那么我们可以如下操作:

struct Student{
 string name;
 int grade;
 
 Student(string name, int grade) : name(name), grade(grade){}
 
 bool operator < (const Student& rhs) const{
  return grade < rhs.grade
  || (grade == rhs.grade && name < rhs.name);
 }
 
 friend void operator << (ostream& output, const Student& s){
  output << s.name << " " << s.grade << endl;
 }
};
int main()
{
 vector<Student> vec;
 
 vec.emplace_back("Jack", 20);
 vec.emplace_back("John", 30);
 vec.emplace_back("Amy", 20);
 vec.emplace_back("Bill", 90);
 
 cout << "Before:" << endl;
 for(auto& s : vec){
  cout << s;
 }
 
 sort(begin(vec),end(vec));
 
 cout << endl << "After:" << endl;
 for(auto& s : vec){
  cout << s;
 }
 
 return 0;
}

运行结果如下图:

1.2 比较函数

当然,我们也可以自己写比较函数,实现如下:

bool cmp(const Student& lhs, const Student& rhs){
 return lhs.grade < rhs.grade
 || (lhs.grade == rhs.grade && lhs.name < rhs.name);
}

按如下方式调用:

sort(begin(vec),end(vec), cmp);

1.3 函数对象

另外一种方式,即构造一个函数对象,抑或叫 functor,其实就是实现了重载 operator() 的一个类,代码如下:

struct Compare{
 bool operator()(const Student& lhs, const Student& rhs){
  return lhs.grade < rhs.grade
  || (lhs.grade == rhs.grade && lhs.name < rhs.name);
 }
};

按如下方式调用:

sort(begin(vec),end(vec), Compare());

1.4 Lambda

C++11有了 Lambda 之后,就不必再为某些小函数写具名函数了,如下使用即可:

sort(begin(vec), end(vec), [](const Student& lhs, const Student& rhs) {
				return lhs.grade < rhs.grade 
				 || (lhs.grade == rhs.grade && lhs.name < rhs.name); });

二、降序

降序排序的方法与升序类似,如果采用比较函数、Lambda 或者比较函数的方式,只需要改一改比较条件就OK了,但是,如果对于Student类,我们定义了 operator < 之后,不想为了降序排序再定义一个 operator > 怎么办?两种办法!

2.1 reverse

升序排序之后,用 reverse 反转即可。

2.2 反向迭代

直接按如下方式调用即可,不用再去重载 operator >

sort(vec.rbegin(), vec.rend());

三、实例补充

对一个5位数的任意整数,求出其降序数。例如,整数是82319,则其降序数是98321。算法提示:将整数的各位数分解到一维整型数组a中,再将a数组中的元素按降序排序,最后输出a数组元素值。

试建立一个类DescendNUM,用于完成该功能。具体要求如下:

(1)私有数据成员
int n:存放5位数的整数。
int a[5]:存放其元素的降序排列值。
(2)公有成员函数
DescendNUM(int x=0):构造函数,用参数x初始化n。
void decompose ():将n的各位数分解到a数组。
void dsort():将a数组排成降序。
void show():显示元素及其降序数。
(3)在主函数中输入一个5位数的任意整数,然后定义一个DescendNUM类对象num,用上述输入的数初始化num,然后完成对该类的测试。

#include "stdafx.h"
#include<iostream>
using namespace std;
class DescendNUM
{
public:
	DescendNUM(int x){ n = x;}//:构造函数,用参数x初始化n。
void decompose ();//:将n的各位数分解到a数组。
void dsort();//:将a数组排成降序。
void show();//:显示元素及其降序数。
private:
	int n;//:存放5位数的整数。
 int a[5];//:存放其元素的降序排列值。
};
 
void DescendNUM::decompose ()
{
	int i=0;
	while(n!=0)
	{
		a[i++] = n%10;
		n = n/10;
	}
}
void DescendNUM::dsort()
{
	int j,i,t;
	int num=a[0];
	for(i=0;i<4;i++)
	for(j=0;j<5;j++)
	{
		if(a[j+1]>a[j])
		{
   t=a[j+1];
		 a[j+1]=a[j];
		 a[j] = t;
		}
	}
}
void DescendNUM::show()
{
	int i;
	for(i=0;i<5;i++)
	{
		cout<<a[i];
	}
	cout<<endl;
}
int main()
{
	DescendNUM num(82319);
	num.decompose ();
	num.dsort();
	num.show();
	return 0;
}

 到此这篇关于C++ sort 排序(降序、升序)使用总结的文章就介绍到这了,更多相关C++降序、升序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Qt读取和写入配置(ini)文件

    Qt读取和写入配置(ini)文件

    ini文件在windows系统中可以存储需要持久保存的配置信息,本文主要介绍了Qt读取和写入配置(ini)文件,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • C语言中settimeofday函数和gettimeofday函数的使用

    C语言中settimeofday函数和gettimeofday函数的使用

    这篇文章主要介绍了C语言中的settimeofday函数和gettimeofday函数的使用,注意settimeofday()函数只返回0和-1,需要的朋友可以参考下
    2015-08-08
  • C++实现简易图书馆管理系统

    C++实现简易图书馆管理系统

    这篇文章主要为大家详细介绍了C++实现简易图书馆管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C语言中使用lex统计文本文件字符数

    C语言中使用lex统计文本文件字符数

    这篇文章主要介绍了C语言中使用lex统计文本文件字符数,本文直接给出实现代码,需要的朋友可以参考下
    2015-04-04
  • C语言 用while循环求和的平均值操作

    C语言 用while循环求和的平均值操作

    这篇文章主要介绍了C语言 用while循环求和的平均值操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 基于C++实现的各种内部排序算法汇总

    基于C++实现的各种内部排序算法汇总

    这篇文章主要介绍了基于C++实现的各种内部排序算法,非常经典,需要的朋友可以参考下
    2014-08-08
  • 深入探索C++中stack和queue的底层实现

    深入探索C++中stack和queue的底层实现

    这篇文章主要介绍了C++中的stack和dequeue的底层实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • C++消息队列(定义,结构,如何创建,发送与接收)

    C++消息队列(定义,结构,如何创建,发送与接收)

    这篇文章主要介绍了C++消息队列(定义,结构,如何创建,发送与接收),消息队列是一种先进先出的队列型数据结构,实际上是系统内核中的一个内部链表
    2022-08-08
  • c++ 函数指针相关总结

    c++ 函数指针相关总结

    这篇文章主要介绍了c++ 函数指针的相关资料,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下
    2021-02-02
  • C++项目实战之makefile使用

    C++项目实战之makefile使用

    这篇文章主要介绍了C++项目实战之makefile使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05

最新评论