STL中sort函数用法简介

合集下载

C++关于STL中sort()对struct排序的方法

C++关于STL中sort()对struct排序的方法

C++关于STL中sort()对struct排序的⽅法 ⼀直没有系统去看过c++,因为懂得⼀些c的基本语法,在实际编程中⽤到c++,只能⽤到哪些看哪些,发现这样虽然能够完成⼤部分⼯作,但是有时候效率实在太低,⽐如说这节要讲的Std::sort()函数的使⽤,调了半天才调通。

开通c/c++序列博客是记录在使⽤c++中⼀些难题,避免以后重犯错,当然以后会尽量挤出时间来较系统学习下c++。

开发环境:QtCreator2.5.1+OpenCV2.4.3 ⾸先来看看std中的快速排序算法sort的使⽤⽅法: 这是⼀个带模板的函数,参数1和2表⽰需要排序的元素在随机迭代器的起始位置和结束位置,其迭代器指向的数据类型可以⾃⼰定义,常见的数据类型包括结构体,vector,类等都可以被使⽤。

参数comp是⽤来决定所采⽤的排序是升序还是逆序的,默认情况下是升序排列。

但是这种默认情况的优势是处理迭代器指向的元素为普通的数据类型,⽐如说整型,字符型等。

如果指向的数据类型为类或者结构体,然后使⽤该类或者结构体中的某个元素进⾏排序,这时候需要⾃⼰定义排序的重载符号”<”。

⽐如说在本次实验中该重载符号的定义为:复制代码代码如下:/*按照降序排列*/bool compare(const PAIR &x, const PAIR &y){return x.point_value > y.point_value;} 如果将comp定义为⼀个函数(⽹上好像很多都是⽤这种类似的函数),⽐如说该函数如下:复制代码代码如下:/*按照降序排列*/bool operator<(const PAIR &x, const PAIR &y){return x.point_value > y.point_value;} 则会报错如下错误: std::sort因为函数参数不明确,所以⽆法推导出模板参数等. 本次实验是基于这样⼀个问题的:有⼀些坐标点集合(2d的坐标点,坐标点之间没有重复),每个坐标点对应⼀个数,现在需要对这些数排序从⽽达到对这些坐标点排序。

stl中的sort函数

stl中的sort函数

stl中的sort函数一、简介STL中的sort函数是一个非常常用的算法,用于对容器中的元素进行排序。

它可以对数组、vector、deque等容器进行排序,并且支持自定义比较函数。

本文将详细介绍STL中的sort函数,包括其使用方法、时间复杂度、稳定性等。

二、使用方法sort函数的使用非常简单,只需要包含头文件<algorithm>即可。

下面是sort函数的基本语法:```template<class RandomAccessIterator>void sort(RandomAccessIterator first, RandomAccessIterator last);template<class RandomAccessIterator, class Compare>void sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);其中,第一个参数first和第二个参数last分别表示要排序的区间的起始位置和结束位置。

注意,这里要求传入的迭代器必须是随机访问迭代器(Random Access Iterator),因为sort函数需要随机访问元素。

例如,对于vector<int> v来说,可以使用v.begin()和v.end()作为参数传入sort函数。

第二个版本的sort函数还接受一个可选参数comp,表示自定义比较函数。

如果不传入该参数,则默认使用operator<进行比较。

下面是一个示例代码:```#include <iostream>#include <algorithm>#include <vector>using namespace std;bool cmp(int a, int b) {return a > b;}int main() {vector<int> v = {4, 2, 1, 5, 3};sort(v.begin(), v.end()); // 默认使用operator<for (int x : v) {cout << x << " ";}cout << endl;sort(v.begin(), v.end(), cmp); // 使用自定义比较函数for (int x : v) {cout << x << " ";}cout << endl;return 0;}```上面的示例代码中,我们首先创建了一个vector<int> v,并将其初始化为{4, 2, 1, 5, 3}。

c++ sort()函数的用法

c++ sort()函数的用法

《探究C++ sort()函数的用法》在C++中,sort()函数是一个非常常用且强大的函数,它可以用于对数组、容器等数据结构进行排序。

本文将深入探讨sort()函数的用法,包括其具体的实现原理、使用方法以及一些实际应用案例。

1. sort()函数的基本用法在C++中,sort()函数属于标准模板库(STL)中的一部分,其声明位于<algorithm>头文件中。

该函数的基本用法是对指定范围内的元素进行排序,具体语法为:```cppsort(first, last);```其中,first和last分别表示要排序的范围的起始位置和结束位置,通常是一个迭代器或指针。

sort()函数会对[first, last)范围内的元素进行升序排序。

2. sort()函数的高级用法除了基本的用法外,sort()函数还可以接受一个自定义的比较函数,从而实现对不同类型或自定义类型的元素进行排序。

比较函数可以是一个函数指针、函数对象或Lambda表达式,例如:```cpp// 使用默认的升序排序sort(vec.begin(), vec.end());// 使用自定义的比较函数进行排序sort(vec.begin(), vec.end(),pare);// 使用Lambda表达式进行排序sort(vec.begin(), vec.end(), [](int a, int b) {return a > b; // 降序排序});```3. sort()函数的实现原理sort()函数通常采用快速排序(quicksort)算法或归并排序(mergesort)算法来实现,这两种算法在大多数情况下都能够提供较高的排序性能。

为了进一步提升性能,sort()函数通常还会结合插入排序(insertion sort)或堆排序(heapsort)等算法来处理较小规模的数据。

4. sort()函数的应用实例实际上,sort()函数可以用于对各种类型的数据进行排序,比如基本数据类型(int、double等)、字符串、结构体、类对象等。

STL之sort函数使用方法

STL之sort函数使用方法

STL之sort函数使⽤⽅法关于SortSort函数是C++ STL(Standard Template Library / 标准函数库) <algorithm>头⽂件中的⼀个排序函数,作⽤是将⼀系列数进⾏排序,因为它的排序⽅式类似于快排,且复杂度为O(NlogN),因此在多数情况下可以基本满⾜排序的需要,相较于⾃⼰⼿撸快排,使⽤sort函数在某些情况下也是⽐较好的⼀个选择。

使⽤前需引⼊头⽂件#include <algorithm>基本操作说明调⽤格式:sort(first, last, comp)参数说明:first : 待排序数组起始地址;last : 待排序数组结束地址;comp : 排序⽅式,该参数是可省参数,如果省略则以升序⽅式排序;那么下⾯我们就来具体看看这个函数是如何使⽤的;Example 1(不使⽤comp参数的情况)1 #include <iostream>2 #include <algorithm>3using namespace std;45int main() {6int vec[] = { 5, 1, 9, 4, 6, 7, 2, 0, 1 };7for (int i = 0; i < 9; i++)8 cout << vec[i] << '';9 cout << endl;10 sort(vec, vec + 9);11for (int i = 0; i < 9; i++)12 cout << vec[i] << '';13 cout << endl;1415return0;16 }⼀段很简单的样例程序,结果也是显⽽易见的;519467201011245679上⾯的样例程序是在不使⽤参数comp的情况下进⾏的排序,可以看到默认是以升序排列的,那么想要进⾏降序排列应该如何实现?Example 21 #include <iostream>2 #include <algorithm>3using namespace std;45bool comp(int a, int b) {6return a > b;7 }89int main() {10int vec[] = { 5, 1, 9, 4, 6, 7, 2, 0, 1 };11for (int i = 0; i < 9; i++)12 cout << vec[i] << '';13 cout << endl;14 sort(vec, vec + 9, comp);15for (int i = 0; i < 9; i++)16 cout << vec[i] << '';17 cout << endl;1819return0;20 }从以上这段样例程序中我们就可以了解到comp参数的使⽤⽅法,原来它不仅仅只是⼀个简单的参数,它实际上是⼀个⽐较函数,但需要注意的是comp虽然是⼀个函数,但是使⽤时不需要返回值,这是使⽤规则;那么结果当然就是以降序的⽅式排列元素;519467201976542110以上都是对sort排序的常⽤操作,下⾯再增加⼀个对结构体进⾏排序的⽅法;Example 3假设结构体S有三个成员,对结构体进⾏排序的规则是:先以a进⾏升序排序,如果a相等则以b进⾏降序排序,如果b相等则以c进⾏降序排序;对于这类排序实际上与正常排序并没有不同,唯⼀需要改变的就是comp函数部分,以下是comp函数部分:1bool comp(S x, S y) {2if (x.a != y.a) return x.a < y.a;3if (x.b != y.b) return x.b > y.b;4return x.c > y.c;5 }针对排序规则⽐较复杂的结构体,这⾥我们⽤⼀个例⼦进⾏简单说明(关于例⼦的详细情况)排序规则如下:按总分进⾏降序排序,如果总分相等则以分数1进⾏降序排序,如果分数1相等则以序号进⾏升序排序;以下是comp函数部分:1bool comp(Stu x, Stu y) {2if (x.s1 + x.s2 > y.s1 + y.s2) return true;3else if (x.s1 + x.s2 == y.s1 + y.s2 && x.s1 > y.s1) return true;4else if (x.s1 + x.s2 == y.s1 + y.s2 && x.s1 == y.s1 && x.num < y.num) return true;5else return false;6 }。

c++ sort函数用法

c++ sort函数用法

c++ sort函数用法sort函数是STL库里的一个算法函数,用来对数组、容器中的元素进行排序。

本文将介绍sort函数的用法及注意点。

sort有多种重载形式,这里介绍两种最常用的:1)sort(first, last)用来对[first, last)区间内的元素进行排序,其中[first, last)表示左闭右开区间的迭代器。

cmp是一个可调用对象,用来比较两个元素的大小。

cmp(a, b)返回true表示a应该排在b的前面,如果cmp(a,b)返回false,则a排在b后面。

2. sort函数的特点sort函数是一个原地(in-place)排序算法,不需要额外的空间开销;时间复杂度为O(nlogn)。

sort排序是一种稳定排序,即排序后相等元素的相对位置不改变。

比如,如果a和b 相等,在排序前a在b前面,则排序后a仍在b前面。

sort函数可以用于排序数组、容器等数据结构。

以下是sort的使用范例:(1)对数组进行排序#include <algorithm>#include <iostream>#include <vector>using namespace std;(3)自定义比较函数sort函数默认按照升序进行排序,但我们也可以根据自己的需要定义比较函数。

举例来说,如果我们要按照字符串长度降序排列:bool cmp(const string& s1, const string& s2) //自定义比较函数{return s1.size() > s2.size(); //按照字符串长度由大到小排序}需要注意的是,自定义比较函数需满足:ⅰ. 比较函数的参数类型必须与容器元素的类型相同,或者是容器元素类型的引用/指针。

ⅱ. 返回类型必须是bool类型。

ⅲ. 如果比较函数返回true,则第一个参数应该排在第二个参数之前。

4.1 对于内置类型的数组,可以直接使用sort函数进行排序;但对于自定义数据类型,需要重载小于号运算符(<)。

详细解说 STL 排序(Sort)

详细解说 STL 排序(Sort)

TWiki>Main Web>STLChina>STLSortAlgorithms(2005.08.15, WinterWen)详细解说 STL 排序(Sort)作者Winter详细解说 STL 排序(Sort)0 前言: STL,为什么你必须掌握1 STL提供的Sort 算法1.1 所有sort算法介绍1.2 sort 中的比较函数1.3 sort 的稳定性1.4 全排序1.5 局部排序1.6 nth_element 指定元素排序1.7 partition 和stable_partition2 Sort 和容器3 选择合适的排序函数4 小结5 参考文档一切复杂的排序操作,都可以通过STL方便实现!0 前言: STL,为什么你必须掌握对于程序员来说,数据结构是必修的一门课。

从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来。

幸运的是这些理论都已经比较成熟,算法也基本固定下来,不需要你再去花费心思去考虑其算法原理,也不用再去验证其准确性。

不过,等你开始应用计算机语言来工作的时候,你会发现,面对不同的需求你需要一次又一次去用代码重复实现这些已经成熟的算法,而且会一次又一次陷入一些由于自己疏忽而产生的bug中。

这时,你想找一种工具,已经帮你实现这些功能,你想怎么用就怎么用,同时不影响性能。

你需要的就是STL, 标准模板库!西方有句谚语:不要重复发明轮子!STL几乎封装了所有的数据结构中的算法,从链表到队列,从向量到堆栈,对hash到二叉树,从搜索到排序,从增加到删除......可以说,如果你理解了STL,你会发现你已不用拘泥于算法本身,从而站在巨人的肩膀上去考虑更高级的应用。

排序是最广泛的算法之一,本文详细介绍了STL中不同排序算法的用法和区别。

1 STL提供的Sort 算法C++之所以得到这么多人的喜欢,是因为它既具有面向对象的概念,又保持了C语言高效的特点。

C++STL中sort方法对自定义类的排序

C++STL中sort方法对自定义类的排序

C++STL中sort⽅法对⾃定义类的排序
C++ STL中提供了效率很⾼的sort⽅法,通常我们利⽤该⽅法对内置数据类型(如:int, double ...)进⾏排序,但是如果需要按照⾃定义类中某个指标对类进⾏排序,那么我们就需要⾃⾏定义⽐较函数cmp,对为sort⽅法的参数。

例如定义⼀个测试类Test:
class Test
{
public:
int i;
int j;
};
⾸先定义⼀个以Test为类型的vector变量,并随机⽣成⼀些数据:
vector<Test> test;
for(int t = 0; t < 10; t++)
{
Test a;
a.i = rand();
a.j = rand();
test.push_back(a);
}
现在调⽤sort⽅法,按照Test中的i指标对Vector进⾏排序:
sort(test.begin(), test.end(), cmp);
bool cmp( const Test a, const Test b)
{
return a.i > b.i; // 降序
// return a.i < b.i; // 升序
}
通过这种⽅式即可实现我们的需求了。

其实sort⽅法还有很多应⽤形式,有关sort的其他应⽤可查阅STL中的相关说明。

C++STLsort函数的用法

C++STLsort函数的用法

C++STLsort函数的⽤法sort 在 STL 库中是排序函数,有时冒泡、选择等(n2) 算法会超时时,我们可以使⽤ STL 中的快速排序函数(n log n) 完成排序sort 在 algorithm 库⾥⾯,原型如下:template <class RandomAccessIterator>void sort ( RandomAccessIterator first, RandomAccessIterator last );template <class RandomAccessIterator, class Compare>void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );我们会发现 sort 有两种形式⼀个有三个参数,⼀个有两个参数,我们先讲讲两个参数的吧!sort 的前两个参数是起始地址和中⽌地址如:sort(a,a+n) 表⽰对 a[0] ... a[n-1] 排序代码如下:#include <algorithm>#include <cstdio>using namespace std;int main() {int n,a[1001];scanf("%d",&n);for (int i = 1;i <= n;i++) scanf("%d",&a[i]);sort(a+1,a+n+1); //对a[1] ... a[n] 排序for (int i = 1;i <= n;i++) printf("%d",a[i]);return 0'}这样是默认升序的,那如果是降序呢?这样,我们就要⽤到第三个参数,第三个参数是⼀个⽐较函数bool cmp(int a,int b) { return a > b; }这个就是降序排序的⽐较函数,意思是:是 a > b 时为true,就不交换,a < b 时为 false,交换然后我们调⽤ sort(a+1,a+n+1,cmp) 就可以对 a 数组进⾏排序了还可以调⽤ greater 和 less 进⾏降/升序排序,其实就是⼀个帮你写好的函数int a[11],n;scanf("%d",&n);for (int i = 1;i <= n;i++) scanf("%d",&a[i]);sort(a+1,a+n+1,greater<int>()); //降序sort(a+1,a+n+1,less<int>()); //升序,注意尖括号内写的是排序的数组类型sort 也能对结构体排序,如:#include <algorithm>#include <cstdio>using namespace std;struct Node {int x,y;} p[1001];int n;bool cmp(Node a,Node b) {if (a.x != b.x) return a.x < b.x;return a.y < b.y;}int main() {scanf("%d",&n);for (int i = 1;i <= n;i++) scanf("%d%d",&p[i].x,&p[i].y);sort(p+1,p+n+1,cmp);for (int i = 1;i <= n;i++) scanf("%d %d\n",p[i].x,p[i].y);return 0;}以上代码的意思是,对 p 数组按 x 升序排序,若两个数的 x 相等则按 y 升序排序结构体还可以重载运算符(greater 和 less 都是重载运算符的),使 sort 只⽤两个参数就可以按⾃⼰的规则排序,如:#include <algorithm>#include <cstdio>using namespace std;struct Node {int x,y;bool operator < (Node cmp) const {if (a.x != cmp.x) return a.x < cmp.x;return a.y < cmp.y;}}p[1001];int n;/*bool cmp(Node a,Node b) {* if (a.x != b.x) return a.x < b.x;* return a.y < b.y;*}*/int main() {scanf("%d",&n);for (int i = 1;i <= n;i++) scanf("%d%d",&p[i].x,&p[i].y); sort(p+1,p+n+1);for (int i = 1;i <= n;i++) scanf("%d %d\n",p[i].x,p[i].y); return 0;}Processing math: 100%。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STL中sort函数用法简介
做ACM题的时候,排序是一种经常要用到的操作。

如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错。

STL里面有个sort函数,可以直接对数组排序,复杂度为n*log2(n)。

使用这个函数,需要包含头文件。

这个函数可以传两个参数或三个参数。

第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。

也就是说,排序的区间是[a,b)。

简单来说,有一个数组int a[100],要对从a[0]到a[99]的元素进行排序,只要写sort(a,a+100)就行了,默认的排序方式是升序。

拿我出的“AC的策略”这题来说,需要对数组t的第0到len-1的元素排序,就写sort(t,t+len);
对向量v排序也差不多,sort(v.begin(),v.end());
排序的数据类型不局限于整数,只要是定义了小于运算的类型都可以,比如字符串类string。

如果是没有定义小于运算的数据类型,或者想改变排序的顺序,就要用到第三参数——比较函数。

比较函数是一个自己定义的函数,返回值是bool型,它规定了什么样的关系才是“小于”。

想把刚才的整数数组按降序排列,可以先定义一个比较函数cmp
bool cmp(int a,int b)
{
return a>b;
}
排序的时候就写sort(a,a+100,cmp);
假设自己定义了一个结构体node
struct node{
int a;
int b;
double c;
}
有一个node类型的数组node arr[100],想对它进行排序:先按a值升序排列,如果a值相同,再按b值降序排列,如果b还相同,就按c降序排列。

就可以写这样一个比较函数:
以下是代码片段:
bool cmp(node x,node y)
{
if(x.a!=y.a) return x.a
if(x.b!=y.b) return x.b>y.b;
return return x.c>y.c;
}
排序时写sort(arr,a+100,cmp);
最后看一个完整的实例,初赛时的一道题目“文件名排序”。

以下是代码片段:
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
//定义一个结构体来表示文件,a代表文件名,b代表文件类型(要么"File"要么"Dir")
struct node{
string a,b;
};
//ASCII码中,所有大写字母排在所有小写字母前面,'A'<'Z'<'a'<'z'
//而这题要求忽略大小写,博彩评级 所以不能直接用字符串的比较。

自定义了一个lt函数,就是less than的意思
//先把两个字符串全部转化为小写,再比较大小(字典序)
bool lt(string x,string y)
{
int i;
for(i=0;i<x.length();i++)
if(x[i]>='A'&&x[i]<='Z')
x[i]='a'+(x[i]-'A');
for(i=0;i<y.length();i++)
if(y[i]>='A'&&y[i]<='Z')
y[i]='a'+(y[i]-'A');
return x<y;
}
//自定义的比较函数,先按b值升序排列(也就是"Dir"排在"File"前面)澳门新濠天地官网
//如果b值相同,再按a升序排列,用的是刚才定义的lt函数
bool comp(node x,node y)
{
if(x.b!=y.b)return x.b<y.b;
return lt(x.a,y.a);
}
int main()
{
node arr[10001];
int size=0;
while(cin>>arr[size].a>>arr[size].b)
size++;
sort(arr,arr+size,comp);
for(int i=0;i<size;i++)
cout<<arr[i].a<<" "<<arr[i].b<<endl;
return 0;
}。

相关文档
最新文档