關(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)