在<QtAlgorithm>头文件中,Qt提供了一些全局的模板函数,这些函数是可以使用在容器上的十分常用的算法。我们可以在任何提供了STL风格迭代器的容器类上用这些算法,包括QList、QLinkedList、QVector、QMap和QHash。如果在目标平台上可以使用STL,那么可以使用STL的算法来代替Qt的这些算法,因为STL提供了更多的算法,而Qt只提供了其中最重要的一些算法。

在历史上,Qt曾经提供的函数是许多STL算法函数的直接等价物。从Qt 5.0开始,QT鼓励我们直接使用STL中可用的实现;大多数Qt已经被弃用(尽管它们仍然可以用于保持旧的代码编译,但会有警告)。

大多数情况下,使用废弃的Qt算法函数的应用程序可以很容易地移植到使用等效的STL函数。你需要
添加#include <algorithm> 头文件,并将Qt函数替换为STL对应函数,如下表所示。

Qt function STL function
qBinaryFind std::binary_search | std::lower_bound
qCopy std::copy
qCopyBackward std::copy_backward
qEqual std::equal
qFill std::fill
qFind std::find
qCount std::count
qSort std::sort
qStableSort std::stable_sort
qLowerBound std::lower_bound
qUpperBound std::upper_bound
qLess std::less
qGreater std::greater

下面对其中几个常用的算法进行演示,可以在帮助索引中査看Generic Algorithms关键字来了解其他的算法。

(1)排序

排序算法的示例如下:

//使用快速排序算法对list进行升序排序,排序后两个12的位置不确定
QList<int> list1;
list1 << 33 << 12 << 68 << 6 << 12;
std::sort(list1.begin(), list1.end());
qDebug() << list1; // 输出:(6, 12, 12, 33, 68)//使用一种稳定排序算法对list2进行升序排序,排序前在前面的12,排序后依然在前面
QList<int> list2;
list2 << 33 << 12 << 68 << 6 << 12;
std::stable_sort(list2.begin(), list2.end());
qDebug() << list2; // 输出:(6, 12, 12, 33, 68)//使用qSort()函数和std::greater算法中使list3反向排序
QList<int> list3;
list3 << 33 << 12 << 68 << 6 << 12;
qSort(list3.begin(), list3.end(), std::greater<int>()); //Qt5已弃用
qDebug() << list3; // 输出:(68, 33, 12, 12, 6)

默认情況下,qSort()将使用 < 运算符进行元素的比较,即升序。如果需要改为降序,需要将qGreater<T>()当作第三个参数传給qSort()函数。

(2)查找

查找算法的示例如下:

//使用std::find()从list中查找"two",返回第一个对应的值的迭代器,如果没有找到则返回end()
QStringList list1;
list1 << "one" << "two" << "three";
QList<QString>::iterator i = std::find(list1.begin(), list1.end(), "two");
qDebug() << *i; //输出:"two"//使用qFind()从list中查找"two",返回第一个对应的值的迭代器,如果没有找到则返回end()
QStringList list2;
list2 << "one" << "two" << "three";
QStringList::iterator j = qFind(list2.begin(), list2.end(), "two");
qDebug() << *j; //输出:"two"

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

(3)复制

复制算法的示例如下:

//将list1中所有项目复制到vect1中
QStringList list1;
list1 << "one" << "two" << "three";
QVector<QString> vect1(list1.count());
std::copy(list1.begin(), list1.end(), vect1.begin());
qDebug() << vect1; //输出:QVector("one", "two", "three")//将list2中所有项目复制到vect2中
QStringList list2;
list2 << "one" << "two" << "three";
QVector<QString> vect2(list2.count());
qCopy(list2.begin(), list2.end(), vect2.begin());
qDebug() << vect2; //输出:QVector("one", "two", "three")

参考:

QT容器中的通用算法

转载于:https://www.cnblogs.com/linuxAndMcu/p/11027942.html

Qt容器类之三:通用算法相关推荐

  1. QT学习笔记(十):通用算法示例

    QT学习笔记(十):通用算法示例 std是C++标准库统一使用的命名空间(namespace)的名称,C++标准库中的名字全部都在std这个命名空间中,std也就是英文"standard&q ...

  2. Qt——容器类(译)

    注:本文是我对Qt官方文档的翻译,错误之处还请指正. 原文链接:Container Classes 介绍 Qt库提供了一套通用的基于模板的容器类,可以用这些类存储指定类型的项.比如,你需要一个大小可变 ...

  3. Qt容器类(总结)(新发现的QQueue和QStack,注意全都是泛型)

     Introduction Qt库提供了一组基于模板的一般化的容器类.这些容器可以存储指定的类型的元素.例如,如果你需要一个可变大小的Qstring数组,可以用QVector<QString ...

  4. C++容器类和Qt容器类的对比

    C++中容器类是属于标准模板库中的内容,有必要回顾下标准模板库.STL = Standard Template Library,标准模板库,惠普实验室开发的一系列软件的统称.从根本上说,STL是一些& ...

  5. Qt学习之路(35): Qt容器类之顺序存储容器

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://devbean.blog.51cto.com/448512/245988 本来计划 ...

  6. 记录转化为有层次结构的树状列表的通用算法

    问题说明: 在获取数据库记录数据的时候, 通常返回的ArrayList集合, 没有了层次关系. 如果每次根据PID重新到数据库获取记录, 可以做到, 但有以下几个缺点: 1. 访问数据库记录次数随着记 ...

  7. 通用算法-sql相似度模糊匹配

    1.需求描述:数据库采集sql语句的记录表,包含记录编号-ID.日期时间-data.sql语句-statement,对表内每一条记录的sql语句和表内其他记录的sql语句进行模糊匹配,以顺序字符匹配方 ...

  8. C++ stl 通用算法和成员函数使用

    在stl中既有通用函数,又有相同成员函数主要表现在list中. 以remove为例 list<int> coll;// insert elements from 6 to 1 and 1 ...

  9. Qt Creator连接通用远程Linux设备

    Qt Creator连接通用远程Linux设备 连接通用远程Linux设备 配置SSH连接 生成SSH密钥 管理设备进程 连接通用远程Linux设备 您可以将通用Linux设备连接到开发PC,以运行, ...

  10. linux加密框架 crypto 通用算法注册接口__crypto_register_alg注册流程

    函数介绍 __crypto_register_alg函数实现向加密框架注册算法(包括静态算法和动态算法)的功能,输入参数为算法说明alg,注册成功时返回算法注册用的算法幼虫larval,注册失败时返回 ...

最新文章

  1. 鸿蒙os系统的iphonexr,iPhoneXS/XR终极防水测试:iPhoneXR不幸阵亡
  2. AI也能「抽象派」作画,圆形+方块组合,可微2D渲染下生成抽象人脸
  3. 9 HTML5之表单
  4. 分享到系统面板_win7电脑没有nvidia控制面板怎么办【解决方法】
  5. QT 5 1 0 MinGW 的安装及使用
  6. 计算机网络第五次笔记
  7. python学习系列:装饰器
  8. 关于Android 11(R)适配指南
  9. python真好玩 pdf 下载_Python真好玩:教孩子学编程_PDF电子书
  10. 显卡mx150和230哪个好_MX130与MX150差距对比分析
  11. 在visio中让图片倾斜
  12. 安装 centos8 设置基础软件仓库时出错
  13. 给定一个数组,求数组的最大连续子数组,使得该子数组的和最大
  14. vlc搭建流媒体转发服务器
  15. 2020云栖大会-达摩院
  16. “内存不能为read/written”是什么原理?
  17. 计算机专业jsp项目,可练手
  18. javascript中的:DOM对象
  19. Swift中的UIKit重力学(一)
  20. Vivado两层电梯简易设计

热门文章

  1. sql语句格式化数字(前面补0)、替换字符串
  2. lua-获取当前时间
  3. Dive into Spring framework -- 了解基本原理(二)--设计模式-part2
  4. HDU ACM 2647 Reward (topology----拓扑排序)
  5. Oracle Library cache 内部机制 说明
  6. silverlight将字符串转化为控件
  7. WebService:JAX-WS实现WebService
  8. zTree模糊搜索(子级和父级都不匹配时隐藏节点)
  9. GDAL根据Shape文件切图(java)
  10. 微信小程序获取当前地理位置中文_微信小程序获取位置信息