`
izuoyan
  • 浏览: 8965439 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Qt学习之路(49): 通用算法

阅读更多

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://devbean.blog.51cto.com/448512/272421
关于Qt的model-view部分就告一段落,今天我们开始新的部分。或许有些朋友觉得前面的部分说得很简单。对此我也没有办法,毕竟,Qt是一个很庞大的库,一时半会根本不可能穷尽所有内容,并且我也有很多东西不知道,有时候也必须去查找资料才能明白。

今天开始的部分是关于Qt提供的一些通用算法。这部分内容来自C++ GUI Programming with Qt 4, 2nd Edition。

<QtAlgorithms>提供了一系列通用的模板函数,用于实现容器上面的基本算法。这部分算法很多依赖于STL风格的遍历器(还记得前面曾经说过的Java风格的遍历器和STL风格的遍历器吗?)。实际上,C++ STL也提供了很多通用算法,包含在<algorithm> 头文件内。这部分算法对于Qt容器同样也是适用的。因此,如果你想使用的算法在Qt的<QtAlgorithms>头文件中没有包含,那么就可以使用STL的算法代替,这并不会产生什么冲突。这里我们来说几个Qt中的通用算法。虽然这些算法都是很简单的,但是,库函数往往会比自己编写的更有效率,因此还是推荐使用系统提供的函数的。

首先是qFind()函数。qFind()函数会在容器中查找一个特定的值。它的参数中有一个起始位置和终止位置,如果被查找的元素存在,函数返回第一个匹配项的位置,否则则返回终止位置。注意,我们这里说的“位置”,实际上是STL风格的遍历器。我们知道,使用STL风格遍历器是可以反映一个位置的。例如下面的例子,i的值将是list.begin() + 1,而j会是list.end():

QStringList list;
list << "Emma" << "Karl" << "James" << "Mariette";

QStringList::iterator i = qFind(list.begin(), list.end(), "Karl");
QStringList::iterator j = qFind(list.begin(), list.end(), "Petra");

qBinaryFind()的行为很像qFind(),所不同的是,qBinaryFind()是二分查找算法,它只适用于查找排序之后的集合,而qFind()则是标准的线性查找。通常,二分查找法使用条件更为苛刻,但是效率也会更高。

qFill()会使用给定值对容器进行填充。例如:

QLinkedList<int> list(10);
qFill(list.begin(), list.end(), 1009);

正如其他基于遍历器的算法一样,qFill()也可以针对容器的一部分进行操作,例如下面的代码将会把vector的前5位设置成1009,而最后5位设置为2013:

QVector<int> vect(10);
qFill(vect.begin(), vect.begin() + 5, 1009);
qFill(vect.end() - 5, vect.end(), 2013);

qCopy()算法可以实现将一个容器中的元素复制到另一个容器,例如:

QVector<int> vect(list.count());
qCopy(list.begin(), list.end(), vect.begin());

qCopy()也可以用于同一容器中的元素的复制。qCopy()操作成功的关键是源容器和目的容器的范围不会发生溢出。例如如下代码,我们将把一个列表的最后两个元素复制给前两个元素:

qCopy(list.begin(), list.begin() + 2, list.end() - 2);

qSort()实现了容器元素的递增排序,使用起来也很简单:

qSort(list.begin(), list.end());

默认情况下,qSort()将使用 < 运算符进行元素的比较。这暗示如果需要的话,你必须定义 < 运算符。如果需要按照递减排序,需要将qGreater<T>()当作第三个参数传给qSort()函数。例如:

qSort(list.begin(), list.end(), qGreater<int>());

注意,这里的T实际上是容器的泛型类型。实际上,我们可以利用第三个参数对排序进行定义。例如,我们自定义的数据类型中有一个大小写不敏感的QString的小于比较函数:

bool insensitiveLessThan(const QString &str1, const QString &str2)
{
return str1.toLower() < str2.toLower();
}

那么,我们可以这样使用qSort()从而可以利用这个函数:

QStringList list;
// ...
qSort(list.begin(), list.end(), insensitiveLessThan);

qStableSort()函数类似与qSort(),所不同之处在于它是稳定排序。稳定排序是算法设计上的一个名词,意思是,在排序过程中,如果有两个元素相等,那么在排序结果中这两个元素的先后顺序同排序前的原始顺序是一致的。举个例子,对于一个序列:a1, a5, a32, a31, a4,它们的大小顺序是a1 < a31 = a32 < a4 < a5,那么稳定排序之后的结果应该是 a1, a32, a31, a4, a5,也就是相等的元素在排序结果中出现的顺序和原始顺序是一致的。稳定排序在某些场合是很有用的,比如,现在有一份按照学号排序的学生成绩单。你想按照成绩高低重新进行排序,对于成绩一样的学生,还是遵循原来的学号顺序。这时候就要稳定排序了。

qDeleteAll()函数将对容器中存储的所有指针进行delete操作。这个函数仅在容器元素是指针的情形下才适用。执行过这个函数之后,容器中的指针均被执行了delete运算,但是这些指针依然被存储在容器中,成为野指针,你需要调用容器的 clear()函数来避免这些指针的误用:

qDeleteAll(list);
list.clear();

qSwap()函数可以交换两个元素的位置。例如:

int x1 = line.x1();
int x2 = line.x2();
if (x1 > x2)
qSwap(x1, x2);

最后,在<QtGlobal>头文件中,也定义了几个有用的函数。这个头文件被其他所有的头文件include了,因此你不需要显式的include这个头文件了。
在这个头文件中有这么几个函数:qAbs()返回参数的绝对值,qMin()和qMax()则返回两个值的最大值和最小值。

本文出自 “豆子空间” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/272421

分享到:
评论

相关推荐

    qt通用算法

    qt的通用算法,学习qt的人必须掌握的知识。

    操作系统实验2 银行家算法编程 用QT+C++实现 参考:http://t.csdn.cn/FSrmR

    编制银行家算法通用程序,并检测思考题中所给状态的安全性。 三、要求: (1) 下列状态是否安全?(三个进程共享12个同类资源) 进程 已分配资源数 最大需求数 1 1 4 (状态a) 2 4 4 3 5 8 1 1 4 2 4 6 ...

    操作系统课程设计 模拟页面置换算法的实现 基于Qt

    基于Qt开发的,模拟操作系统的内存页面置换算法的实现。该项目主要是模拟操作系统的内存管理中的页面置换算法,对比几种算法的优劣,并将结果以动态的形式展示出来。选择了四种置换算法:先来先服务(FIFO)、最近最少...

    Qt AES算法ECB模式 PKCS5Padding 128bit

    最近找Qt下可用的与java通用的AES加密解密代码。 openssl不是很好用(不会和Qt编译到一起。。。) 所以参考网上的资料,终于找到了一个C++可用的代码,稍作修改。

    基于QT与OpenCv的一款数字图像处理系统源码+项目说明.zip

    2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于QT与...

    【机器视觉Qt+OpenCV从零开始 -001】Qt5.8下第一个带框架界面的Canny算法程序

    本科期间学习过C语言,拿到了计算机二级证书,此外主要自学MATLAB和Python进行深度学习相关的编程。一直以为C++和C#与C语言大同小异,没有重视,在学校的项目需要用C++进行编程,并且甲方点名界面要用Qt做,觉得MFC...

    利用python qt和机器学习实现医学影像X光片的识别与分析.zip

    机器学习是一种通用的数据处理技术,其包含了大量的学习算法。不同的学习算法在不同的行业及应用中能够表现出不同的性能和优势。目前,机器学习已成功地应用于下列领域: 互联网领域----语音识别、搜索引擎、语言...

    福优林@Qt5小白变大牛初级篇word---第4章.pdf

    然而,STL风格的迭代器会更高效,并且可以和Qt和STL的通用算法结合使用。 Qt中的容器和STL中的类似,也分为序列式容器和关联式容器。 序列式容器有:QList,QLinkedList,QVector,QStack,QQueue。对大部分应用程序...

    Qt+opencv环境配置

    OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库...它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

    nodeeditor:Qt节点编辑器。 数据流编程框架

    目的NodeEditor被认为是基于Qt的通用库,旨在进行图形控制的数据处理。 节点代表具有某些输入和输出的算法。 连接将数据从第一个节点的输出(源)传输到第二个节点的输入(接收器)。 NodeEditor框架是Visual 工具。...

    基于opencv传统图像处理算法实现物体尺寸测量系统C++源码+项目说明+详细注释.zip

    2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于...

    SuperCollider-3.11.0-macOS-signed.zip 亲测可用:用于音频合成和算法合成的平台

    SuperCollider是用于音频合成和算法合成的平台,供从事声音工作的音乐家,艺术家和研究人员使用。它是可用于Windows,macOS和Linux的免费开源软件。 SuperCollider具有三个主要组件:实时音频服务器scsynth,构成...

    Yolo-Fastest:Yolo通用目标检测模型与EfficientNet-lite结合使用,计算量仅为230Mflops(0.23Bflops),模型大小为1.3MB

    :high_voltage: Yolo-Fastest :high_voltage: 简单,快速,紧凑,易于移植适用于所有平台的实时目标检测算法基于yolo的最快和最小的已知通用目标检测算法针对ARM移动终端的优化设计,经过优化以支持推理框架基于RK...

    基于Qt环境下物理实验数据处理系统的设计与实现

    基于物理实验数据的处理复杂性与繁琐性,采用Qt软件所提供的C++编程环境,进行实验数据处理软件开发。以迈克尔逊干涉仪实验数据处理为实例,设计研发得到一套实验数据计算分析的处理软件。可适应迈克尔逊干涉仪实验...

    多媒体文件类型.doc

    多媒体文件类型 多媒体文件类型 图片: .bmp .gif .jpg .jpeg .psd .png 声音: .wav .mp1 .mp2 .mp3 .mp4 .mid .ra .rm .ram .rmi 视频文件... JPEG: 也是应用最广泛的图片格式之一, 它采用一种特殊的有损压缩算法,

    GSK_Robot_Sys:带Qt的GSK机器人控制器系统

    GSK_Robot_SysGSK Robot Controller System with Qt介绍 本项目设计一个工业机器人控制系统(手持示教器),包括界面设计、机器人控制语言解释器、插补算法等等。项目目前包含以下部分:MFC 框架显示库 —— 是一个...

    matlab代码做游戏-Qt:t

    -STDCXX,算法,容器,迭代器和其他基本组件的集合。 [已退休] [Apache2] -Apache可移植运行时。 另一个跨平台实用程序函数库。 [Apache2] -Adobe Source Libraries提供了经过同行评审的可移植C ++源库。 [麻省理工...

    实现自己的Prisma(基于QT和OpenCV实现Android平台上基于AI的图像处理APP)

    基于OpenCV.DNN和QtQuick,集成StyleTransfer算法,实现Android系统上的Prisma程序 界面实现上,基于QML.control2实现通用界面 算法功能上,集成ST算法,实现著名的手机应用软件Prisma能力。 同时包括对天空替换、...

    mandelbulber2:Mandelbulber v2的官方存储库

    覆盖范围扫描建置状态奇特聊天 Linux: 视窗: OSX: Azure:通用理念Mandelbulber创造性地生成三维分形。 探索三角,超复杂,Mandelbox,IFS和许多其他3D分形。 使用大量可自定义的材料进行渲染,以创建令人惊叹的...

    QCalculatorUI.zip

    通用计算器的实现,使用QT带界面,使用数据结构设计算法,包含次方的计算 和数值e的计算 源码

Global site tag (gtag.js) - Google Analytics