c++STL标准库排序函数std::sort使用

news2024/9/22 1:05:51

Qt系列文章目录

文章目录

  • Qt系列文章目录
  • 前言
  • 一、错误原因
  • 二、修改后的代码

前言

C++ sort()排序函数
C++ STL 标准库中的 sort() 函数,本质就是一个模板函数。正如表 1 中描述的,该函数专门用来对容器或普通数组中指定范围内的元素进行排序,排序规则默认以元素值的大小做升序排序,除此之外我们也可以选择标准库提供的其它排序规则(比如std::greater降序排序规则),甚至还可以自定义排序规则。
sort() 函数是基于快速排序实现的,有关快速排序的具体实现过程,感兴趣的读者可阅读《快速排序(QSort,快排)算法》一文。

需要注意的是,sort() 函数受到底层实现方式的限制,它仅适用于普通数组和部分类型的容器。换句话说,只有普通数组和具备以下条件的容器,才能使用 sort() 函数:
容器支持的迭代器类型必须为随机访问迭代器。这意味着,sort() 只对 array、vector、deque 这 3 个容器提供支持。
如果对容器中指定区域的元素做默认升序排序,则元素类型必须支持<小于运算符;同样,如果选用标准库提供的其它排序规则,元素类型也必须支持该规则底层实现所用的比较运算符;
sort() 函数在实现排序时,需要交换容器中元素的存储位置。这种情况下,如果容器中存储的是自定义的类对象,则该类的内部必须提供移动构造函数和移动赋值运算符。

另外还需要注意的一点是,对于指定区域内值相等的元素,sort() 函数无法保证它们的相对位置不发生改变。例如,有如下一组数据:

bool MainFramework::sortStrips(const QString &a, const QString &b)
{
    QStringList aSplit = a.split('_');
    QStringList bSplit = b.split('_');

    int aFirstPart = aSplit[0].toInt();
    int bFirstPart = bSplit[0].toInt();

    if (aFirstPart == bFirstPart) {
        int aSecondPart = aSplit[5].toInt();
        int bSecondPart = bSplit[5].toInt();
        return aSecondPart > bSecondPart;
    } else {
        return aFirstPart < bFirstPart;
    }
}

void MainFramework::groupStrips()
{
    for(const QString& fileName : m_colorCAllFiles)
    {
        if(fileName.contains("_04_")) {
            m_colorCfiles04.append(fileName);
        } else if(fileName.contains("_02_")) {
            m_colorCfiles02.append(fileName);
        } else if(fileName.contains("_05_")) {
            m_colorCfiles05.append(fileName);
        }
    }

    std::sort(m_colorCfiles04.begin(), m_colorCfiles04.end(), sortStrips);
    std::sort(m_colorCfiles02.begin(), m_colorCfiles02.end(), sortStrips);
    std::sort(m_colorCfiles05.begin(), m_colorCfiles05.end(), sortStrips);

}

在使用c++STL标准库排序函数std::sort编译器报错:1.E:\work\ImageManageSys\MainFramework.cpp:586: error: C3867: “MainFramework::sortStrips”: 非标准语法;请使用 “&” 来创建指向成员的指针
2.E:\work\ImageManageSys\MainFramework.cpp:586: error: C2672: “std::sort”: 未找到匹配的重载函数
3.E:\work\ImageManageSys\MainFramework.cpp:586: error: C2780: “void std::sort(const _RanIt,const _RanIt)”: 应输入 2 个参数,却提供了 3 个
MainFramework.cpp(586): error C2780: “void std::sort(const _RanIt,const _RanIt)”: 应输入 2 个参数,却提供了 3 个
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\include\algorithm(7403): note: 参见“std::sort”的声明

在这里插入图片描述

一、错误原因

这个错误是因为在使用std::sort()时,你传递了一个成员函数指针,而非普通函数指针。为了解决这个问题,你可以使用C++11的lambda表达式作为比较器。以下是修改后的groupStrips()方法:

二、修改后的代码


bool MainFramework::sortStrips(const QString &a, const QString &b)
{
    QStringList aSplit = a.split('_');
    QStringList bSplit = b.split('_');

    int aFirstPart = aSplit[0].toInt();
    int bFirstPart = bSplit[0].toInt();

    if (aFirstPart == bFirstPart) {
        int aSecondPart = aSplit[5].toInt();
        int bSecondPart = bSplit[5].toInt();
        return aSecondPart > bSecondPart;
    } else {
        return aFirstPart < bFirstPart;
    }
}

void MainFramework::groupStrips()
{
    for(const QString& fileName : m_colorCAllFiles)
    {
        if(fileName.contains("_04_")) {
            m_colorCfiles04.append(fileName);
        } else if(fileName.contains("_02_")) {
            m_colorCfiles02.append(fileName);
        } else if(fileName.contains("_05_")) {
            m_colorCfiles05.append(fileName);
        }
    }

    auto sortStripsLambda = [this](const QString &a, const QString &b) {
        return this->sortStrips(a, b);
    };

    std::sort(m_colorCfiles04.begin(), m_colorCfiles04.end(), sortStripsLambda);
    std::sort(m_colorCfiles02.begin(), m_colorCfiles02.end(), sortStripsLambda);
    std::sort(m_colorCfiles05.begin(), m_colorCfiles05.end(), sortStripsLambda);
}

我们在groupStrips()方法内定义了一个名为sortStripsLambda的lambda表达式,这个表达式将调用sortStrips()成员函数。然后,我们将sortStripsLambda作为比较器传递给std::sort()函数。现在这段代码应该能够正常编译并运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/465475.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ML】windows 安装使用pytorch

使用pytorch需要python环境&#xff0c;建议是直接装anaconda &#xff0c;IDE用visual studio anaconda安装 Anaconda 是一个用于科学计算的 Python 发行版&#xff0c;支持 Linux, Mac, Windows, 包含了众多流行的科学计算、数据分析的 Python 包 官网链接anaconda 本人下载…

(转)maven安装及配置(详细版)

1.下载&#xff1a; 方式一可以从官方下载&#xff0c;下载页面&#xff1a;http://maven.apache.org/download.cgi 方式二&#xff1a;或者题主提供的版本下载maven安装包 提取码&#xff1a;ysns 下载好后是一个压缩文件 2.安装&#xff1a; maven压缩包解压到一个没有中文&a…

AI 编程

GitHub Copilot&#xff08;收费&#xff09; 开发者&#xff1a;微软 openAI 2022年8月22日之后开始收费&#xff0c;10美元/月&#xff0c;100美元/年。 CodeGeeX&#xff08;免费&#xff09; CodeGeeX 可以根据自然语言注释描述&#xff08;支持中英文注释&#xff09…

20.$refs

$refs是vue操作DOM用的&#xff0c;每一个vue组件实例上&#xff0c;都包含一个$refs对象&#xff0c;里面存储对应的DOM元素或组件的引用&#xff0c;默认情况下$refs对象为空 目录 1 $refs在哪 2 使用ref操作DOM 3 使用ref操作组件 3.1 使用组件方法 3.2 操作组件…

13 JS04——运算符

目标&#xff1a; 1、运算符 2、算数运算符 3、递增和递减运算符 4、比较运算符 5、逻辑运算符 6、赋值运算符 7、运算符优先级 一、运算符 1、概念 运算符&#xff08;operator&#xff09;也被称作操作符&#xff0c;是用于实现赋值、比较和执行算数运算等功能的符号。 2…

解决java普通项目读取不到resouces目录下资源文件的办法

现象如下&#xff1a; 可以看到resources目录已经在idea中标记成了资源目录resources root&#xff0c;而且target/classes目录下也编译出了resources目录下的pci.properties文件&#xff0c;换句话说&#xff1a;java在编译时是读取到了resources下的文件的。 可是为什么new F…

App性能优化方案——布局层级太多怎么优化?

作者&#xff1a;小海编码日记 View整体布局是通过深度优先的方式来进行组织的&#xff0c;整体形似一颗树&#xff0c;所以优化布局层级主要通过三个方向来实施&#xff1a; 降低布局深度&#xff1a;使用merge标签或者布局层级优化等手段来减少View树的深度&#xff1b;布局…

代码随想录算法训练营第四十三天|1049. 最后一块石头的重量 II 、494. 目标和、474.一和零

文章目录 背包问题题型1049. 最后一块石头的重量 II494. 目标和474.一和零 背包问题题型 等和子集 —0-1背包能否装满最后一块石头—0-1背包尽量装满目标和—0-1背包装满&#xff0c;且有多少种装的方式&#xff08;组合问题&#xff09; 1049. 最后一块石头的重量 II 题目链…

网页爬虫之WebPack模块化解密(JS逆向)

WebPack打包: webpack是一个基于模块化的打包&#xff08;构建&#xff09;工具, 它把一切都视作模块。 概念&#xff1a; webpack是 JavaScript 应用程序的模块打包器,可以把开发中的所有资源&#xff08;图片、js文件、css文件等&#xff09;都看成模块&#xff0c;通过loade…

Java中Lambda表达式(面向初学者)

目录 一、Lambda表达式是什么&#xff1f;什么场景下使用Lambda&#xff1f; 1.Lambda 表达式是什么 2.函数式接口是什么 第二章、怎么用Lambda 1.必须有一个函数式接口 2.省略规则 3.Lambda经常用来和匿名内部类比较 第三章、具体使用场景举例&#xff08;&#xff09; …

水果店(库)管理系统 —— 实现了管理员模式与顾客模式 JAVA

水果店&#xff08;库&#xff09;管理系统 1.前言&#xff1a;2.功能简介及部分测试视频&#xff1a;3.本管理系统的构建原理&#xff08;简介)&#xff1a;(1).如何跳转页面&#xff1a;(2).如何让控制台能输出彩色字体&#xff1a;(3).如何稳定存储数据&#xff1a;(4).如何…

误操作清空了回收站文件如何找到文件

我们在删除文件的时候&#xff0c;文件都是先跑到回收站里的&#xff0c;这样的防止我们出现误删的情况&#xff0c;但往往也会出现我们要恢复删除的文件却误操作清空了回收站的情况&#xff0c;那么误操作清空了回收站如何找到呢&#xff0c;下面小编给大家分享误操作清空了回…

window 10 安装node.js时遇到2502 2503错误(已解决)

node安装失败2503的解决办法&#xff1a;1、在WIN搜索框搜索powershell并右击&#xff1b;2、点击使用管理员身份运行powershell命令行工具&#xff1b;3、输入“msiexec /package node”&#xff1b;4、打开安装包&#xff0c;根据提示安装即可。 本文操作环境&#xff1a;Win…

9.Join的应用

1.reduceJoin的应用 案例&#xff1a;将两个表合并成一个新的表 需求分析&#xff1a;通过将关联条件作为Map输出的key&#xff08;此处指pid&#xff09;&#xff0c;将两表满足Join条件的数据并携带数据所来源的文件信息&#xff0c;发往同一个ReduceTask&#xff0c;在Redu…

汇编小程序解析--3D立方体旋转

汇编小程序解析–3D立方体旋转&#xff0c;源代码如下&#xff0c;是vulture大神于1995年写的&#xff0c;我到现在才基本看懂。 ;本程序由国外的Vulture大哥编写&#xff0c;并公布了源码&#xff0c;这个是他95年的一个作品&#xff0c;可以说是在当时是非常成功的&#xff…

论shell之条件语句-if语句、case语句

目录 一&#xff1a;条件测试 1.文件测试 2.常见的测试操作符 3.整数值比较 ​4.字符串比较 ​5. 逻辑测试 二&#xff1a;if语句 1.单分支结构 2.单分支结构实例 3.双分支结构 4.双分支结构实例 5.多分支结构 6.多分支机构实例 7.嵌套if语句实例 三&#xff1a;case语…

2023企业服务的关键词:做强平台底座

作者 | 曾响铃 文 | 响铃说 4月下旬&#xff0c;软件行业相关的大会紧锣密鼓地开了好几场&#xff0c;不仅有政府主办的2023中国国际软件发展大会、中国软件创新发展大会&#xff0c;也有用友、浪潮等服务商举办的品牌活动&#xff0c;让软件业的话题一直保持热度。 以用友为…

十大排序算法简单总结与对比

假设排序均从小到大排序 排序算法工作原理平均时间复杂度最坏时间复杂度空间复杂度是否稳定排序冒泡排序把相邻元素两两比较&#xff0c;若左侧的元素大于右侧的元素&#xff0c;则交换&#xff0c;否则不交换。&#xff08;每一轮最大的会跑到最右边&#xff09;O(&#xff0…

VGA协议实践

文章目录 前言一、VGA接口定义与传输原理1、VGA接口定义2、传输原理3、不同分辨率对应不同参数 二、Verilog编程1、VGA显示彩色条纹2、VGA显示字符3、输出一幅彩色图像4、Quartus操作1、添加PLL核2、添加ROM核 三、全部代码四、总结五、参考资料 前言 VGA的全称是Video Graphi…

VBA最基础的趣味速成练习--VBA资料

很多朋友想学VBA&#xff0c;但是苦于无处入手&#xff0c;我特意花了几天时间&#xff0c;做了一个VBA速成练习表格 能让你快速上手VBA&#xff0c;感受到VBA的神奇之处&#xff0c;相信我们日常使用表格的朋友会非常喜欢它的&#xff0c; 下面是我们的表格界面&#xff0c;…