问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C++ 结构体排序 - sort

创作时间:
作者:
@小白创作中心

C++ 结构体排序 - sort

引用
CSDN
1.
https://blog.csdn.net/hjx1235/article/details/145514470

说到排序,我们之前讲过冒泡排序,我们也可以写一个冒泡排序函数来排序一组结构体数据,但是这里给大家介绍一个C++的STL中的库函数sort ,可以直接用来排序数据,在算法竞赛和日常开发中使用非常频繁。只要涉及到数据的排序,又没有明确要求自己实现排序算法的时候,就可以直接使用sort函数。

sort函数介绍:

//版本1 
template <class RandomAccessIterator>
void sort (RandomAccessIterator first, RandomAccessIterator last);
//void sort(开始位置,结束位置); 
//first:指向要排序范围的第一个元素的迭代器或者指针。 
//last:指向要排序范围的最后一个元素之后位置的迭代器或者指针。 
//版本2 
template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare 
comp);
//void sort(开始位置,结束位置,自定义排序函数); 
//first:指向要排序范围的第一个元素的迭代器或者指针。 
//last:指向要排序范围的最后一个元素之后位置的迭代器或者指针。 
//comp:是一个比较函数或者函数对象 
//这里开始位置和结束位置,可以是指针,也可以是迭代器 
//自定义排序函数 可以是函数,也可以是仿函数  

在默认情况下 sort 函数,按升序对给定范围[first,last)中的元素进行排序。


sort 函数需要包含的头文件 <algorithm>

对数组进行排序

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
 int arr[] = { 4,5,6,9,7,1,2,8,5,4,2 };
 int size = sizeof(arr) / sizeof(arr[0]);
 //起始位置和结束位置传的是地址 
 sort(arr, arr + size);
 for (int i = 0; i < size; i++)
 {
 cout << arr[i] << " ";
 }
 cout << endl;
 return 0;
}  

对字符串中的字符进行排序

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
 string s("defxxxabccba");
 sort(s.begin(), s.end());
 cout << s << endl;
 return 0;
}  

自定义排序

使用自定义排序方式

void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

sort 的第三个参数是一个可选的自定义比较函数(或函数对象),用于指定排序的规则。如果不提供这个参数, std::sort 默认会使用小于运算符( < )来比较元素,并按照升序排序。这个比较函数,接受两个参数,并返回一个布尔值。如果第一个参数应该排在第二个参数之前,则回true;否则返回false。

#include <iostream>
#include <algorithm>
using namespace std;
//自定义一个比较函数,这个比较函数能够比较被排序数据的2个元素大小 
//函数返回bool类型的值 
//
bool compare(int x, int y) 
{
 return x > y;//排降序 
}
int main()
{
 int arr[] = { 4,5,6,9,7,1,2,8,5,4,2 };
 int size = sizeof(arr) / sizeof(arr[0]);
 //将函数名作为第三个参数传入sort函数中 
 sort(arr, arr + size, compare);
 for (int i = 0; i < size; i++)
 {
 cout << arr[i] << " ";
 }
 cout << endl;
 return 0;
}  

排序结构体数据

两个结构体数据也是不能直接比较大小的,在使用 sort 函数排序的时候,也是需要提供自定义的比较方法。比如:

#include <iostream>
#include <algorithm>
using namespace std;
struct S
{
 string name;
 int age;
};
bool cmp_s_by_age(const struct S& s1, const struct S& s2)
{
 return s1.age > s2.age; //按年龄降序  
}
bool cmp_s_by_name(const struct S& s1, const struct S& s2)
{
 return s1.name > s2.name;//按名字降序  
 }
//测试自定义比较函数 
void test1()
{
 struct S s[3] = { {"zhangsan", 20}, {"lisi", 25}, {"wangwu", 18} };
 sort(s, s + 3, cmp_s_by_age);
 int i = 0;
 for (i = 0; i < 3; i++)
 {
 cout << s[i].name << " " << s[i].age << endl;
 }
}
struct CmpByNameLess
{
 bool operator()(const struct S& s1, const struct S& s2)
 {
 return s1.name < s2.name; //按照名字升序  
 }
};
struct CmpByAgeGreater
{
 bool operator()(const struct S& s1, const struct S& s2)
 {
 return s1.age > s2.age; //按照年龄降序  
 }
};
//测试结构中重载()运算符实现比较 
void test2()
{
 struct S s[3] = { {"zhangsan", 20}, {"lisi", 25}, {"wangwu", 18} };
 sort(s, s + 3, CmpByNameLess);
 int i = 0;
 for (i = 0; i < 3; i++)
 {
 cout << s[i].name << " " << s[i].age << endl;
 }
}
int main()
{
 test1();
 test2();
 return 0;
}  
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号