您好,欢迎来到筏尚旅游网。
搜索
您的当前位置:首页C++使用sort对容器排序的实现

C++使用sort对容器排序的实现

来源:筏尚旅游网
C++使⽤sort对容器排序的实现

本⽂主要解决以下问题

STL中sort的使⽤⽅法使⽤sort对vector的排序使⽤sort对map排序使⽤sort对list排序

STL中sort的使⽤⽅法

C++ STL 标准库中的 sort() 函数,本质就是⼀个模板函数。该函数专门⽤来对容器或普通数组中指定范围内的元素进⾏排序,排序规则默认以元素值的⼤⼩做升序排序,除此之外我们也可以选择标准库提供的其它排序规则(⽐如std::greater降序排序规则),甚⾄还可以⾃定义排序规则。

值得⼀提的是,sort() 函数位于头⽂件中,因此在使⽤该函数前,程序中应包含如下语句:

#include

sort() 函数有 2 种⽤法,其语法格式分别为:

//对 [first, last) 区域内的元素做默认的升序排序

void sort (RandomAccessIterator first, RandomAccessIterator last);//按照指定的 comp 排序规则,对 [first, last) 区域内的元素进⾏排序

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

其中,first 和 last 都为随机访问迭代器,它们的组合 [first, last) ⽤来指定要排序的⽬标区域;另外在第 2 种格式中,comp 可以是 C++ STL 标准库提供的排序规则(⽐如 std::greater),也可以是⾃定义的排序规则。数组排序样例:

#include #include using namespace std;

int main(){

int arr[] = {2,6,3,5,4,8,1,0,9,10}; sort(arr, arr+10);

for(int i = 0;i < 10;i++) cout << arr[i] << \" \";}// out/*

0 1 2 3 4 5 6 8 9 10*/

使⽤ STL 标准库提供的排序规则

int main(){

int arr[] = {2,6,3,5,4,8,1,0,9,10}; sort(arr, arr+10, std::greater()); for(int i = 0;i < 10;i++) cout << arr[i] << \" \"; cout << endl;

sort(arr, arr+10, std::less()); for(int i = 0;i < 10;i++) cout << arr[i] << \" \";}// out/*

10 9 8 6 5 4 3 2 1 00 1 2 3 4 5 6 8 9 10*/

使⽤⾃定义⽐较器

bool cmp(const int a, const int b){ return a < b;}

int main(){

int arr[] = {2,6,3,5,4,8,1,0,9,10}; sort(arr, arr+10, cmp); for(int i = 0;i < 10;i++) cout << arr[i] << \" \";}// out/*

0 1 2 3 4 5 6 8 9 10*/

使⽤ lambda 表达式⾃定义⽐较器

int main(){

int arr[] = {2,6,3,5,4,8,1,0,9,10};

sort(arr, arr+10, [](const int a, const int b){ return a < b; });

for(int i = 0;i < 10;i++) cout << arr[i] << \" \";}// out/*

0 1 2 3 4 5 6 8 9 10*/

使⽤sort对vector的排序

在 C++ 中⼏乎操作vector时,⼏乎可以视作是在操作数组,可以将vector看作对数组的封装。因此,使⽤sort对vector进⾏排序时完全可以遵循上⾯使⽤sort对数组的排序⽅法。⼀维vector排序

int main(){

vector vec = {2,6,3,5,4,8,1,0,9,10}; sort(vec.begin(), vec.end()); for(int item: vec)

cout << item << \" \"; return 0;}// out/*

0 1 2 3 4 5 6 8 9 10*/

⼆维vector排序。数组保存⼀系列的坐标,先按照第⼆维进⾏升序排列,再按照第⼀维升序排列

int main(){

vector> vvi = {{9,1}, {2,3}, {8,7}, {6,2}, {5,2}};

sort(vvi.begin(), vvi.end(), [](const vector& v1, const vector& v2){ if(v1[1] < v2[1]) return true;

else if(v1[1] == v2[1]) return v1[0] < v2[0]; else return false; });

for(vector v: vvi){ for(int item: v){

cout << item << \" \"; }

cout << endl; } return 0;}// out/*9 15 26 22 38 7*/

使⽤sort对map排序

map是⽤来存放键值对的数据结构,可以很⽅便快速的根据key查到相应的value,map本⾝的实现⽅式内含了⽐较器的设置,只要我们在map初始化的时候传⼊⽐较器,即可完成对应的排序。定义包含⽔果及其个数的map,按照⽔果名称字典序进⾏排序 (按key排序)

#includeusing namespace std;

int main(){

map> msi; msi[\"apple\"] = 5;

msi[\"watermelon\"] = 2; msi[\"pear\"] = 3; msi[\"peach\"] = 6; msi[\"cherry\"] = 10;

for(auto item: msi)

cout << item.first << \" \" << item.second << endl; return 0;}// out/*

apple 5cherry 10peach 6pear 3

watermelon 2*/

定义包含⽔果及其个数的map,按照⽔果个数进⾏排序,当⽔果个数相同时,按照⽔果名称字典序排序 (将map转为vector进⾏排序)

bool cmp(const pair& a, const pair& b){ if(a.second < b.second) return true;

else if(a.second == b.second) return a.first < b.first; else return false;}

int main(){

map msi; msi[\"apple\"] = 5;

msi[\"watermelon\"] = 2; msi[\"pear\"] = 3; msi[\"peach\"] = 5; msi[\"cherry\"] = 10;

vector> vpi(msi.begin(), msi.end()); sort(vpi.begin(), vpi.end(), cmp);

for(auto item: vpi){

cout << item.first << \" \" << item.second << endl; }

return 0;}// out/*

watermelon 2pear 3apple 5peach 5cherry 10*/

使⽤sort对list排序

sort() 函数模板定义在头⽂件 algorithm 中,要求使⽤随机访问迭代器。但 list 容器并不提供随机访问迭代器,只提供双向迭代器,因此不能对 list 中的元素使⽤ sort() 算法。但是,还是可以进⾏元素排序,因为 list 模板定义了⾃⼰的 sort() 函数。sort()

有两个版本:⽆参 sort() 函数将所有元素升序排列。第⼆个版本的 sort() 接受⼀个函数对象或 lambda 表达式作为参数,这两种参数都定义⼀个断⾔⽤来⽐较两个元素。list排序⽰例

int main(){

list ls = {\"one\ ls.sort([](const string& a, const string& b){ return a < b; });

for(string item: ls) cout << item << \" \"; return 0;}// out/*

one three two*/

参考⽂献

到此这篇关于C++使⽤sort对容器排序的实现的⽂章就介绍到这了,更多相关C++ sort对容器排序 内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- efsc.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务