首页 > 其他分享 >Sort函数的使用

Sort函数的使用

时间:2024-04-10 21:05:38浏览次数:18  
标签:Sort std 函数 strArray sort 使用 排序 lambda

std::sort函数是<algorithm>头文件中的一个模板函数,用于对容器中的元素进行排序。通常,std::sort函数需要三个参数:

  1. 指向要排序序列的起始位置的迭代器。
  2. 指向要排序序列的结束位置之后一个位置的迭代器。
  3. 一个可选的比较函数或可调用对象,用于确定排序顺序。

当你只传递两个参数给std::sort时,你实际上是在使用前两个必需的参数,而省略了第三个可选的比较函数。在这种情况下,std::sort会使用元素的默认比较方式,这通常适用于内置类型(如整数和浮点数),它们已经定义了小于(<)操作符,这种可用于直接对数组的大小进行排序。只需要直接传递数组的头元素和首元素即可。

当传递三个参数时,这里举例字符串数组中用字符串的长度对数组进行排序。

#include <iostream>  
#include <vector>  
#include <algorithm>  
#include <string>  
  
// 自定义比较函数,根据字符串长度进行比较  
bool compareByLength(const std::string& a, const std::string& b) {  
    return a.length() < b.length();  
}  
  
int main() {  
    // 创建一个字符串向量  
    std::vector<std::string> strArray = {"apple", "banana", "kiwi", "cherry", "date"};  
  
    // 使用std::sort和自定义比较函数对字符串向量进行排序  
    std::sort(strArray.begin(), strArray.end(), compareByLength);  
  
    // 输出排序后的字符串向量  
    for (const auto& str : strArray) {  
        std::cout << str << " (length: " << str.length() << ")" << std::endl;  
    }  
  
    return 0;  
}

这里是在第三个参数的时候调用了一个自定义函数compareByLength,在自定函数中明确了比较方法。函数调用的时候选择返回一个bool,原因如下:

std::sort算法期望其比较函数(或可调用对象)返回一个布尔值(bool),这是因为std::sort需要这个返回值来确定两个元素之间的顺序关系。具体来说,std::sort会使用这个返回值来决定元素是否应该交换位置以达到排序的目的。

比较函数或可调用对象接受两个参数,通常被命名为ab,并返回一个bool值,这个值告诉std::sort算法a应该在b之前、之后,还是它们相等。根据这个返回值,std::sort会决定是否需要交换这两个元素的位置。

  • 如果比较函数返回true,则通常意味着a应该在b之前。
  • 如果比较函数返回false,则通常意味着a应该在b之后或它们相等(取决于排序是稳定排序还是不稳定排序)。

使用bool作为返回类型是明确且符合直觉的,因为bool只有两个可能的值:truefalse,这正好对应了两种可能的顺序关系。其他可以隐式转换为bool的类型(如整数或指针),虽然技术上可能可行,但它们的语义可能不够清晰,容易导致错误和混淆。

也可以不用调用这个函数,而是使用lambda表达式,如下:

#include <iostream>  
#include <algorithm>  
#include <string>  
  
int main() {  
    // 创建一个字符串数组  
    std::string strArray[] = {"apple", "banana", "kiwi", "cherry", "date"};  
    const size_t arraySize = sizeof(strArray) / sizeof(strArray[0]);  
  
    // 使用std::sort和lambda表达式对字符串数组进行排序  
    std::sort(strArray, strArray + arraySize, [](const std::string& a, const std::string& b) {  
        return a.length() < b.length();  
    });  
  
    // 输出排序后的字符串数组  
    for (size_t i = 0; i < arraySize; ++i) {  
        std::cout << strArray[i] << " (length: " << strArray[i].length() << ")" << std::endl;  
    }  
  
    return 0;  
}

Lambda表达式:

Lambda表达式(也称为lambda函数或匿名函数)是C++11引入的一个新特性,它允许你定义一个匿名的内联函数对象,并可以将其用作任何需要函数对象的地方。Lambda表达式特别适用于需要小函数但又不希望编写整个函数定义或类定义的场合。

Lambda表达式的基本语法如下:

[capture](parameters) -> return_type { body_of_lambda }
  • capture:捕获子句,定义了lambda表达式可以从其包围作用域中捕获哪些变量以及如何捕获这些变量。捕获可以是按值(=)或按引用(&),或者可以显式地列出要捕获的变量。
  • parameters:lambda函数的参数列表,与常规函数的参数列表类似。
  • return_type:返回类型。如果lambda体只包含单个返回语句,且其返回类型可以被编译器推导出,则可以省略此部分。否则,需要显式指定返回类型。
  • body_of_lambda:lambda函数的主体,即实现的功能代码。
  • 对于Lambda还有其他用法,详情请见其他文章。

时间复杂度:

std::sort函数通常基于快速排序、归并排序或它们的混合实现,其平均时间复杂度为O(n log n),其中n是要排序的元素数量。这意味着排序时间大致与元素数量的对数成正比。这是排序算法中相当高效的时间复杂度,特别是对于大型数据集。

在最坏的情况下,std::sort的时间复杂度可能接近O(n^2),但这通常只会在特定输入数据(例如已经排序或逆序的数组)上发生。然而,由于std::sort的实现通常会尽量避免这种情况,因此在实际应用中很少会遇到最坏情况的时间复杂度。

标签:Sort,std,函数,strArray,sort,使用,排序,lambda
From: https://blog.csdn.net/2302_79103603/article/details/137534758

相关文章

  • 《C++程序设计》阅读笔记【7-堆和拷贝构造函数】
    ......
  • C语言: 字符串函数(下)
    片头在上一篇中,我们介绍了字符串函数。在这一篇章中,我们将继续学习字符串函数,准备好了吗?开始咯!1.strncpy函数1.1strncpy函数的用法strncpy是C语言中的一个字符串处理函数,它用于将一个字符串的一部分内容复制到另一个字符串中。其函数原型为:char*strncpy(char*dest......
  • 使用 endless 库实现不停服更新 demo
    packagemainimport("github.com/fvbock/endless""github.com/gin-gonic/gin""log")funcmain(){router:=gin.Default()router.GET("/",func(c*gin.Context){c.JSON(200,gin.H{"......
  • 解决OpenEuler上无法使用varlgrind
    一般来说,欧拉操作系统都没有安装glibc-debuginfo,所以需要排查注入内存泄漏问题,需要使用valgrind时,它会报错,提示需要暗转glibc-debuginfo。错误信息一般张这样。valgrind:Fatalerroratstartup:afunctionredirectionvalgrind:whichismandatoryforthisplatform-tool......
  • 布隆过滤器 及 Redis Sorted sets 使用注意事项
    布隆过滤器基本概念布隆过滤器(英语:BloomFilter)是1970年由伯顿·霍华德·布隆(BurtonHowardBloom)提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有......
  • sort和sorted的区别使用
    l=list(map(int,input().split()))b=sorted(l,reverse=False)#reverse=True是降序,False是降序print(b)#sorted()函数是将一个排好序的列表赋给另一变量a.sort(reverse=False)#用法和sorted一样#只不过sort函数直接将列表进行排序不能赋给其他列表在代码里我们可以在注释里......
  • 创建一个简单的区块链,并使用 Flask 框架提供一个简单的 Web 接口来与区块链交互。
    目录前言一、代码展示二、代码注释1.简单的区块链模拟实现,这段代码定义了一个简单的区块链类,可以创建一个新的区块链,并能够添加新的区块到链上,同时获取最新的区块信息。这个模拟的区块链可以用于教学或演示区块链的基本概念。2.这段代码是一个简单的工作量证明(ProofofWo......
  • 关于atoi和strtol函数
    提示:文章文章目录前言一、背景二、2.12.2总结前言前期疑问:本文目标:一、背景最近在牛课题HJ33整数与IP地址间的转换题目时,涉及到大量的字符串和整型数值的转换,重新看一下字符和整型转换的函数二、2.1​避免使用atoi、atol、atoll、atof函数字符串中可能......
  • python初学者笔记(7)——求和函数总结
    python经常要用到各种求和,例如列表求和,元素求和,利用函数求和,将这些方法总结发给大家!1.python两个数的求和函数defsum_2_num(num1,num2):result=num1+num2returnresult#必须在执行行输入,函数命名后必须调用,调用sum_2_num(),或者print()#sum_2_num(10,20......
  • python函数 学习第二部分
    函数大纲:六、函数说明文档#定义函数,进行文档说明defadd(x,y):"""函数说明:paramx:参数x表示其中一个加数:paramy:参数y表示另一个加数:return:返回两数相加的结果"""result=x+yreturnresultr=add(5,6)print(r)......