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;
}
热门推荐
《咏柳》贺知章唐诗全诗赏析
为什么手机电池总是不够用?
HTML中如何获取和格式化日期
为什么说梵语是神的语言
贵州自驾游:春节游,美食与美景的极致体验
2024年诺贝尔生理学或医学奖微小RNA,让我们重新认识RNA的功能
超写实主义先驱、新绘画流派开创者:丹尼斯·彼得森
猪血一下锅就老,大厨教您正确做法,牢记4点,猪血滑嫩又鲜香
排骨不管怎么做,切记不要直接焯水,教你一招,肉质鲜嫩不腥不柴
八字命理中正财与偏财的区别及其对个人命运的影响是什么
摩托车对城市空气质量的影响
沈阳的历史名字揭秘
中国企业出海策略分析:多元化路径与本土化运营
长期头痛、头晕、肩颈酸痛?当心是失眠在作祟
游戏人生16种族详解:从神灵种到人类种的完整种族谱系
项目管理中错误信息传播的处理机制
毛绒文创走红,可爱经济何以“圈粉”年轻人
《与凤行》大火的背后,凤凰的历史形象你又知道多少呢?
《山海经》中的神物:凤凰的神话与象征
开展数字教育,教师要从技术上退出来,让学生去用技术
收购不良资产数量减少、质量下降,AMC机构困局中突围
商业养老金:新机遇与挑战-应对人口老龄化的综合策略
中小学教师基本功:如何打造一堂高效的试卷讲评课?
双屏办公与多流传输(MST)技术的必要性
桑椹乾的保健功效
婆媳关系的智慧:她是如何化解家庭中的小矛盾的?
每天一个水煮蛋,是营养佳品还是心血管杀手?看完后就明白了
NBA球队本赛季夺冠概率分析及湖人前景展望
什么是API设计?
强友使用非甾体抗炎药,警惕8类副作用,牢记6大注意事项!