鍍金池/ 教程/ C/ 通用算法
Qt 容器和算法拾遺
自定義 model 之一
反走樣
Hello, world!
Qt 容器類之關(guān)聯(lián)存儲(chǔ)容器
QStringListModel
拖放技術(shù)之一
狀態(tài)欄
QTreeWidget
拖放技術(shù)之二
通用算法
event()
Qt 學(xué)習(xí)之路(18): Qt 標(biāo)準(zhǔn)對(duì)話框之 QInputDialog
Qt 容器類之遍歷器和隱式數(shù)據(jù)共享
QListWidget
Meta-Object 系統(tǒng)
事件接收與忽略
Qt 學(xué)習(xí)之路(tip): parent 參數(shù)
Qt 標(biāo)準(zhǔn)對(duì)話框之 QColorDialog
QPainter(續(xù))
國(guó)際化(下)
漸變填充
自定義委托
創(chuàng)建 shared library
model-view 架構(gòu)
Graphics View Framework
自定義拖放數(shù)據(jù)對(duì)象
QSortFilterProxyModel
國(guó)際化(上)
組件布局
自定義 Model 之三
事件過(guò)濾器
QDirModel
Hello, world!(續(xù))
Qt 標(biāo)準(zhǔn)對(duì)話框之 QFileDialog
自定義 model 之二
深入了解信號(hào)槽
坐標(biāo)變換
剪貼板操作
QTableWidget
QByteArray 和 QVariant
創(chuàng)建一個(gè)對(duì)話框(下)
Qt 學(xué)習(xí)之路(32): 一個(gè)簡(jiǎn)易畫(huà)板的實(shí)現(xiàn)(Graphics View)
文本文件讀寫(xiě)
自定義事件
編寫(xiě)跨平臺(tái)的程序
MainWindow
初探信號(hào)槽
Qt 學(xué)習(xí)之路(17): Qt 標(biāo)準(zhǔn)對(duì)話框之 QMessageBox
繪圖設(shè)備
菜單和工具條(續(xù))
二進(jìn)制文件讀寫(xiě)
QString
事件(event)
菜單和工具條
QPainter
Qt 容器類之順序存儲(chǔ)容器
進(jìn)程間交互
API 文檔的使用
創(chuàng)建一個(gè)對(duì)話框(上)
一個(gè)簡(jiǎn)易畫(huà)板的實(shí)現(xiàn)(QWidget)

通用算法

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

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

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