本文主要解决以下问题

  1. STL中sort的使用方法
  2. 使用sort对vector的排序
  3. 使用sort对map排序
  4. 使用sort对list排序

STL中sort的使用方法

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

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

#include <algorithm>

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 <algorithm>
#include <algorithm> 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<int>());
for(int i = 0;i < 10;i++)
cout << arr[i] << " ";
cout << endl;
sort(arr, arr+10, std::less<int>());
for(int i = 0;i < 10;i++)
cout << arr[i] << " ";
}
// out
/*
10 9 8 6 5 4 3 2 1 0
0 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<int> 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<vector<int>> vvi = {{9,1}, {2,3}, {8,7}, {6,2}, {5,2}}; sort(vvi.begin(), vvi.end(), [](const vector<int>& v1, const vector<int>& v2){
if(v1[1] < v2[1]) return true;
else if(v1[1] == v2[1]) return v1[0] < v2[0];
else return false;
}); for(vector<int> v: vvi){
for(int item: v){
cout << item << " ";
}
cout << endl;
} return 0;
}
// out
/*
9 1
5 2
6 2
2 3
8 7
*/

使用sort对map排序

map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value,map本身的实现方式内含了比较器的设置,只要我们在map初始化的时候传入比较器,即可完成对应的排序。

定义包含水果及其个数的map,按照水果名称字典序进行排序 (按key排序)

#include<map>

using namespace std;

int main(){
map<string, int, less<string>> 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 5
cherry 10
peach 6
pear 3
watermelon 2
*/

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

bool cmp(const pair<string, int>& a, const pair<string, int>& 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<string, int> msi;
msi["apple"] = 5;
msi["watermelon"] = 2;
msi["pear"] = 3;
msi["peach"] = 5;
msi["cherry"] = 10; vector<pair<string, int>> 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 2
pear 3
apple 5
peach 5
cherry 10
*/

使用sort对list排序

sort() 函数模板定义在头文件 algorithm 中,要求使用随机访问迭代器。但 list 容器并不提供随机访问迭代器,只提供双向迭代器,因此不能对 list 中的元素使用 sort() 算法。但是,还是可以进行元素排序,因为 list 模板定义了自己的 sort() 函数。sort() 有两个版本:无参 sort() 函数将所有元素升序排列。第二个版本的 sort() 接受一个函数对象或 lambda 表达式作为参数,这两种参数都定义一个断言用来比较两个元素。

list排序示例

int main(){
list<string> ls = {"one", "two", "three"};
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()排序函数用法详解

C++ Lambda表达式详解

STL-map的简单用法

C++ STL中Map的按Key排序和按Value排序

C++ list(STL list)排序及合并元素方法详解

C++中使用sort对常见容器排序的更多相关文章

  1. java中Collections.sort()方法实现集合排序

    1.Integer/String泛型的List进行排序 List <Integer> integerlist = new ArrayList<Integer>();   //定 ...

  2. C# 中 List.Sort运用(IComparer<T>)排序用法

    /// <summary> /// 比较人物类实例大小,实现接口IComparer /// </summary> public class InternetProtocolCo ...

  3. 【转载】C#中自定义Sort的排序规则IComparable接口

    C#中的List集合在排序的时候,如果不使用Lambda表达式进行排序的话,一般调用Sort()方法进行排序,如果希望Sort()方法排序后的结果跟我们预想的效果一致或者按照我们自定义的规则排序,则需 ...

  4. [转] C++的STL库,vector sort排序时间复杂度 及常见容器比较

    http://www.169it.com/article/3215620760.html http://www.cnblogs.com/sharpfeng/archive/2012/09/18/269 ...

  5. C++ STL中常见容器的时间复杂度和比较和分析

    C++ STL中常见容器的时间复杂度 map, set, multimap, and multiset 上述四种容器采用红黑树实现,红黑树是平衡二叉树的一种.不同操作的时间复杂度近似为: 插入: O( ...

  6. Java开发中使用sort排序

    Java开发中使用sort排序 BaiduSpring https://baijiahao.baidu.com/s?id=1625440912158830354&wfr=spider& ...

  7. 模拟javascript中的sort排序

    一.javascript中sort对数据进行排序的原理 sort() 方法对数组的元素做原地的排序,并返回这个数组. sort 可能不是稳定的.默认按照字符串的Unicode码位点排序; 语法:arr ...

  8. C语言中常见的排序方法

    在C语言中,常见的排序方法有冒泡法,排序法,插入法等等.所谓的冒泡法,就是对一组数字进行从大到小或者从小到大的一种排序方法.主要就是相邻的数值相互交换.从第一个数值开始,如果这相邻的两个数值排序与我们 ...

  9. 用Java集合中的Collections.sort方法对list排序的两种方法

    用Collections.sort方法对list排序有两种方法第一种是list中的对象实现Comparable接口,如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

随机推荐

  1. ajax函数

    使用三个函数是按ajax请求的处理 1.$.ajax() jQuery中实现ajax的核心函数 2.$.post() 使用post方式做ajax请求 3.$.get 使用get方式做ajax请求 $. ...

  2. DNA序列(JAVA语言)

    package 第三章习题; /*  * 输入m个长度均为n的DNA序列,求一个DNA序列,到所有序列的总Hamming距离尽量小.  * 两个等长字符串的Hamming距离等于字符不同的位置个数, ...

  3. Java开发工程师面试-Web基础与数据处理

    Servlet执行流程 客户端浏览器向Tomcat服务器发送Http请求 Tomcat解析web.xml文件,找到对应的url以及servlet-name,根据servlet-name找到对应的ser ...

  4. Kubernetes中利用Kubectl set 让Deployment更新镜像

    问题描述 我的deployment有单个pod,我的自定义docker镜像如下: containers: - name: mycontainer image: myimage:latest 在开发过程 ...

  5. 痞子衡嵌入式:MCUXpresso IDE下在线调试时使用不同复位策略的现象总结

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下在线调试时使用不同复位策略的现象总结. 本篇实际上是<IAR在线调试时设不同复位类型可能会导致i.M ...

  6. Java(65-80)【方法、数组】

    1.方法的三种调用:单独调用.打印调用.赋值调用 单独调用就是调用方法并不进行输出: 打印调用就是对方法进行输出 赋值调用就是将结果赋值给一个变量再进行输出 void是没有返回值的,因此只能进行赋值单 ...

  7. Dynamics CRM实体系列之图表

    本节开始讲解Dynamics CRM的图表功能.任何产品基本上都会有数据分析的工具,Dynamics CRM当然也不例外,作为一个专门做销售管理的软件数据分析自然也是对于销售管理者的决策有很大的作用的 ...

  8. User-Agent大全 python

    1 # -*-coding:utf-8 -*- 2 3 import random 4 5 # 返回一个随机的请求头 headers 6 def getheaders(): 7 # 各种PC端 8 u ...

  9. 老和尚给小和尚讲故事引发了Java设计模式:组合模式

    目录 示例 组合模式 定义 意图 主要解决问题 优缺点 安全式和透明式的组合模式 安全式的合成模式的结构 透明式的合成模式的结构 老和尚和小和尚的故事 示例 有一个绘图系统,可以描绘各种图形,假设现在 ...

  10. day7.文件处理

      @字符编码 见:https://zhuanlan.zhihu.com/p/108805502 一.文件基本操作 ''' 1.什么是文件     文件是操作系统提供给用户或者应用程序的一种操作硬盘的 ...