codecamp

Qt 通用算法

通用算法

关于 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
Qt 自定义委托
QString
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }