Qt 通用算法

2018-10-08 09:49 更新

通用算法

关于 Qt 的 model-view 部分就告一段落,今天我们开始新的部分。或许有些朋友觉得前面的部分说得很简单。对此我也没有办法,毕竟,Qt 是一个很庞大的库,一时半会根本不可能穷尽所有内容,并且我也有很多东西不知道,有时候也必须去查找资料才能明白。

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

提供了一系列通用的模板函数,用于实现容器上面的基本算法。这部分算法很多依赖于STL 风格的遍历器(还记得前面曾经说过的 Java 风格的遍历器和 STL 风格的遍历器吗?)。实际上,C++ STL 也提供了很多通用算法,包含在头文件内。这部分算法对于 Qt 容器同样也是适用的。因此,如果你想使用的算法在 Qt 的头文件中没有包含,那么就可以使用 STL 的算法代替,这并不会产生什么冲突。这里我们来说几个 Qt 中的通用算法。虽然这些算法都是很简单的,但是,库函数往往会比自己编写的更有效率,因此还是推荐使用系统提供的函数的。
首先是 qFind()函数。qFind()函数会在容器中查找一个特定的值。它的参数中有一个起始位置和终止位置,如果被查找的元素存在,函数返回第一个匹配项的位置,否则则返回终止位置。注意,我们这里说的“位置”,实际上是 STL 风格的遍历器。我们知道,使用 STL 风格遍历器是可以反映一个位置的。例如下面的例子,i 的值将是 list.begin() + 1,而 j 会是list.end():```QStringList list; list list(10); qFill(list.begin(), list.end(), 1009);```正如其他基于遍历器的算法一样,qFill()也可以针对容器的一部分进行操作,例如下面的代码将会把vector 的前5位设置成1009,而最后5位设置为2013:```QVector vect(10); qFill(vect.begin(), vect.begin() + 5, 1009); qFill(vect.end() - 5, vect.end(), 2013);```qCopy()算法可以实现将一个容器中的元素复制到另一个容器,例如:```QVector 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()将使用 ()当作第三个参数传给 qSort()函数。例如:```qSort(list.begin(), list.end(), qGreater());```注意,这里的 T 实际上是容器的泛型类型。实际上,我们可以利用第三个参数对排序进行定义。例如,我们自定义的数据类型中有一个大小写不敏感的 QString 的小于比较函数:```bool insensitiveLessThan(const QString &str1, const QString &str2) { return str1.toLower() x2) qSwap(x1, x2);```
最后,在头文件中,也定义了几个有用的函数。这个头文件被其他所有的头文件 include了,因此你不需要显式的 include 这个头文件了。在这个头文件中有这么几个函数:qAbs()返回参数的绝对值,qMin()和 qMax()则返回两个值的最大值和最小值。
本文出自 “豆子空间” 博客,请务必保留此出处 http://devbean.blog.51cto.com/448512/193918
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号