STL之sort应用

简介: STL之sort应用

前言


顾名思义,sort()是标准库中的排序算法,能用此算法的容器是支持随机访问的容器:vector, deque, string,array。

其有两种形式,第一种sort(a,b),其中a,b为排序的地址范围,为[a,b),此时用operator<作比较,默认升序排序。

第二种sort(a,b,comp),此时采用comp进行比较,comp带两个同类型的参数,如果第一个参数排在第二个参数前面,返回true,否则返回false,它可以是函数指针,也可以是函数对象,即仿函数。

下为几个常见的仿函数:

less(小于)

greater(大于)

equal_to(等于)

not_equal_to(不相等)

less_equal(小于等于)

greater_equal(大于等于)

须注意不能直接写入仿函数的名字,而是要写其重载的()函数:

less<>()

greater<>()


常见sort分类


1.全排序


sort 和 stable_sort,前者不稳定,采用快排,后者为稳定排序,归并排序


2.部分排序


partial_sort,如part_sort(a,a+n,comp);只排前n个,采用堆排序,显然适用于求解topn问题。


结构体排序


针对两种sort的两种形式主要有两种应用形式。


1.运算符重载


采用sort(a,b),或者只想利用上述常见的伪函数,需要用到运算符重载。

#include<iostream>
#include<algorithm> 
#include<string>
using namespace std;
struct student{
  string name;
  int age;
  bool operator<(const student &a)const{//运算符重载 
  if(name==a.name)return age<a.age;
  return name<a.name; 
  }
};
int main(){
  student s[3] ;
  s[0].name="Kndy";s[0].age=12;
  s[1].name="Anm";s[1].age=17;
  s[2].name="Kndy";s[2].age=11;
  sort(s,s+3);
  for(int i=0;i<3;i++)
  cout<<s[i].name<<"  "<<s[i].age<<endl;
  return 0;
}


输出结果:

1685008737177.jpg

若上述重载是对>重载,排序改为:sort(s,s+3,greater<student>());,降序排序,结果为:

1685008744490.jpg


2.比较函数


此时需自己定义一个比较函数,如果第一个参数排在第二个参数前面,返回true,否则返回false。

#include<iostream>
#include<algorithm> 
#include<string>
using namespace std;
struct student{
  string name;
  int age;
};
bool comp(const student &a,const student &b){
  if(a.name==b.name)return a.age<b.age;
  return a.name<b.name;
}
int main(){
  student s[3] ;
  s[0].name="Kndy";s[0].age=12;
  s[1].name="Anm";s[1].age=17;
  s[2].name="Kndy";s[2].age=11;
  sort(s,s+3,comp);
  for(int i=0;i<3;i++)
  cout<<s[i].name<<"  "<<s[i].age<<endl;
  return 0;
}


显然此时应该是升序排序结果如下:

1685008577635.jpg

相关文章
|
7月前
|
存储 安全 算法
C++的内置数组和STL array、STL vector
C++的内置数组和STL array、STL vector
|
8月前
|
存储 Serverless C++
【C++入门到精通】哈希 (STL) _ unordered_map _ unordered_set [ C++入门 ]
【C++入门到精通】哈希 (STL) _ unordered_map _ unordered_set [ C++入门 ]
97 1
|
8月前
|
C++ 容器
C++|STL-list运用(1)
C++|STL-list运用(1)
|
8月前
|
存储 算法 Linux
【STL】:vector用法详解
【STL】:vector用法详解
96 1
|
人工智能 算法 C++
c++ stl vector 的相关用法
c++ stl vector 的相关用法
100 0
c++ stl vector 的相关用法
c++STL vector的用法详解
c++STL vector的用法详解
121 0
|
算法 C++ Java
STL中排序函数的用法(Qsort,Sort,Stable_sort,Partial_sort,List::sort)
都知道排序很重要,也学了各式各样的排序算法,冒泡、插入、归并等等,但其实在ACM比赛中,只要不是太慢的算法,都可以适用(除非某些题目卡时间卡的很死),这个时候,速度与技巧便成了关键,而在C++的标准库中,就已经定义好了一些排序函数,下面来一一介绍它们吧=7= Qsort 函数原型为void qs...
2511 0