Qt 通用算法

2018-10-08 09:49 更新

通用算法

關于 Qt 的 model-view 部分就告一段落,今天我們開始新的部分?;蛟S有些朋友覺得前面的部分說得很簡單。對此我也沒有辦法,畢竟,Qt 是一個很龐大的庫,一時半會根本不可能窮盡所有內(nèi)容,并且我也有很多東西不知道,有時候也必須去查找資料才能明白。

今天開始的部分是關于 Qt 提供的一些通用算法。這部分內(nèi)容來自 C++ GUI Programming with Qt 4, 2nd Edition。

提供了一系列通用的模板函數(shù),用于實現(xiàn)容器上面的基本算法。這部分算法很多依賴于STL 風格的遍歷器(還記得前面曾經(jīng)說過的 Java 風格的遍歷器和 STL 風格的遍歷器嗎?)。實際上,C++ STL 也提供了很多通用算法,包含在頭文件內(nèi)。這部分算法對于 Qt 容器同樣也是適用的。因此,如果你想使用的算法在 Qt 的頭文件中沒有包含,那么就可以使用 STL 的算法代替,這并不會產(chǎn)生什么沖突。這里我們來說幾個 Qt 中的通用算法。雖然這些算法都是很簡單的,但是,庫函數(shù)往往會比自己編寫的更有效率,因此還是推薦使用系統(tǒng)提供的函數(shù)的。
首先是 qFind()函數(shù)。qFind()函數(shù)會在容器中查找一個特定的值。它的參數(shù)中有一個起始位置和終止位置,如果被查找的元素存在,函數(shù)返回第一個匹配項的位置,否則則返回終止位置。注意,我們這里說的“位置”,實際上是 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()算法可以實現(xiàn)將一個容器中的元素復制到另一個容器,例如:```QVector vect(list.count()); qCopy(list.begin(), list.end(), vect.begin());```qCopy()也可以用于同一容器中的元素的復制。qCopy()操作成功的關鍵是源容器和目的容器的范圍不會發(fā)生溢出。例如如下代碼,我們將把一個列表的最后兩個元素復制給前兩個元素:```qCopy(list.begin(), list.begin() + 2, list.end() - 2);```qSort()實現(xiàn)了容器元素的遞增排序,使用起來也很簡單:```qSort(list.begin(), list.end());```默認情況下,qSort()將使用 ()當作第三個參數(shù)傳給 qSort()函數(shù)。例如:```qSort(list.begin(), list.end(), qGreater());```注意,這里的 T 實際上是容器的泛型類型。實際上,我們可以利用第三個參數(shù)對排序進行定義。例如,我們自定義的數(shù)據(jù)類型中有一個大小寫不敏感的 QString 的小于比較函數(shù):```bool insensitiveLessThan(const QString &str1, const QString &str2) { return str1.toLower() x2) qSwap(x1, x2);```
最后,在頭文件中,也定義了幾個有用的函數(shù)。這個頭文件被其他所有的頭文件 include了,因此你不需要顯式的 include 這個頭文件了。在這個頭文件中有這么幾個函數(shù):qAbs()返回參數(shù)的絕對值,qMin()和 qMax()則返回兩個值的最大值和最小值。
本文出自 “豆子空間” 博客,請務必保留此出處 http://devbean.blog.51cto.com/448512/193918
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號