QT 通用算法

一、QT通用算法

<QtAlgorithms>提供了一系列QT通用的模板函數(shù),用于實(shí)現(xiàn)容器上面的基本算法。這部分算法很多依賴(lài)于STL風(fēng)格的遍歷器(還記得前面曾經(jīng)說(shuō)過(guò)的Java風(fēng)格的遍歷器和STL風(fēng)格的遍歷器嗎?)。實(shí)際上,C++ STL也提供了很多通用算法,包含在<algorithm>頭文件內(nèi)。這部分算法對(duì)于Qt容器同樣也是適用的。因此,如果你想使用的算法在Qt的<QtAlgorithms>頭文件中沒(méi)有包含,那么就可以使用STL的算法代替,這并不會(huì)產(chǎn)生什么沖突。這里我們來(lái)說(shuō)幾個(gè)Qt中的通用算法。雖然這些算法都是很簡(jiǎn)單的,但是,庫(kù)函數(shù)往往會(huì)比自己編寫(xiě)的更有效率,因此還是推薦使用系統(tǒng)提供的函數(shù)的

容器:vector、list、queue、stack

1.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 << "Emma" << "Karl" << "James" << "Mariette"; 
 
QStringList::iterator i = qFind(list.begin(), list.end(), "Karl"); 
QStringList::iterator j = qFind(list.begin(), list.end(), "Petra");

2.qBinaryFind()的行為很像qFind(),所不同的是,qBinaryFind()是二分查找算法,它只適用于查找排序之后的集合,而qFind()則是標(biāo)準(zhǔn)的線性查找。通常,二分查找法使用條件更為苛刻,但是效率也會(huì)更高。

qFill()會(huì)使用給定值對(duì)容器進(jìn)行填充。例如:

QLinkedList<int> list(10); 
qFill(list.begin(), list.end(), 1009);

3.qFill()正如其他基于遍歷器的算法一樣,也可以針對(duì)容器的一部分進(jìn)行操作,例如下面的代碼將會(huì)把vector的前5位設(shè)置成1009,而最后5位設(shè)置為2013:

QVector<int> vect(10); 
qFill(vect.begin(), vect.begin() + 5, 1009); 
qFill(vect.end() - 5, vect.end(), 2013);

4.qCopy()算法可以實(shí)現(xiàn)將一個(gè)容器中的元素復(fù)制到另一個(gè)容器,例如:

QVector<int> 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);

5.qSort()實(shí)現(xiàn)了容器元素的遞增排序,使用起來(lái)也很簡(jiǎn)單:

qSort(list.begin(), list.end());

默認(rèn)情況下,qSort()將使用 < 運(yùn)算符進(jìn)行元素的比較。這暗示如果需要的話,你必須定義 < 運(yùn)算符。如果需要按照遞減排序,需要將qGreater<T>()當(dāng)作第三個(gè)參數(shù)傳給qSort()函數(shù)。例如:

qSort(list.begin(), list.end(), qGreater<int>());

注意,這里的T實(shí)際上是容器的泛型類(lèi)型。實(shí)際上,我們可以利用第三個(gè)參數(shù)對(duì)排序進(jìn)行定義。例如,我們自定義的數(shù)據(jù)類(lèi)型中有一個(gè)大小寫(xiě)不敏感的QString的小于比較函數(shù):

bool insensitiveLessThan(const QString &str1, const QString &str2) 
{ 
       return str1.toLower() < str2.toLower(); 
}

那么,我們可以這樣使用qSort()從而可以利用這個(gè)函數(shù):

QStringList list; 
// ... 
qSort(list.begin(), list.end(), insensitiveLessThan);

qStableSort()函數(shù)類(lèi)似與qSort(),所不同之處在于它是穩(wěn)定排序。穩(wěn)定排序是算法設(shè)計(jì)上的一個(gè)名詞,意思是,在排序過(guò)程中,如果有兩個(gè)元素相等,那么在排序結(jié)果中這兩個(gè)元素的先后順序同排序前的原始順序是一致的。舉個(gè)例子,對(duì)于一個(gè)序列:a1, a5, a32, a31, a4,它們的大小順序是a1 < a31 = a32 < a4 < a5,那么穩(wěn)定排序之后的結(jié)果應(yīng)該是 a1, a32, a31, a4, a5,也就是相等的元素在排序結(jié)果中出現(xiàn)的順序和原始順序是一致的。穩(wěn)定排序在某些場(chǎng)合是很有用的,比如,現(xiàn)在有一份按照學(xué)號(hào)排序的學(xué)生成績(jī)單。你想按照成績(jī)高低重新進(jìn)行排序,對(duì)于成績(jī)一樣的學(xué)生,還是遵循原來(lái)的學(xué)號(hào)順序。這時(shí)候就要穩(wěn)定排序了。

6.qDeleteAll()函數(shù)將對(duì)容器中存儲(chǔ)的所有指針進(jìn)行delete操作。這個(gè)函數(shù)僅在容器元素是指針的情形下才適用。執(zhí)行過(guò)這個(gè)函數(shù)之后,容器中的指針均被執(zhí)行了delete運(yùn)算,但是這些指針依然被存儲(chǔ)在容器中,成為野指針,你需要調(diào)用容器的clear()函數(shù)來(lái)避免這些指針的誤用:

qDeleteAll(list); 
list.clear();

7.qSwap()函數(shù)可以交換兩個(gè)元素的位置。例如:

int x1 = line.x1(); 
int x2 = line.x2(); 
if (x1 > x2) 
       qSwap(x1, x2);

最后,在<QtGlobal>頭文件中,也定義了幾個(gè)有用的函數(shù)。這個(gè)頭文件被其他所有的頭文件include了,因此你不需要顯式的include這個(gè)頭文件了。
在這個(gè)頭文件中有這么幾個(gè)函數(shù):qAbs()返回參數(shù)的絕對(duì)值,qMin()和qMax()則返回兩個(gè)值的最大值和最小值。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 標(biāo)簽(空格分隔): STL 運(yùn)用STL,可以充分利用該庫(kù)的設(shè)計(jì),讓我為簡(jiǎn)單而直接的問(wèn)題設(shè)計(jì)出簡(jiǎn)單而直接的解決方案,...
    認(rèn)真學(xué)計(jì)算機(jī)閱讀 1,506評(píng)論 0 10
  • 1 序 2016年6月25日夜,帝都,天下著大雨,拖著行李箱和同學(xué)在校門(mén)口照了最后一張合照,搬離寢室打車(chē)去了提前租...
    RichardJieChen閱讀 5,165評(píng)論 0 12
  • STL(標(biāo)準(zhǔn)模板庫(kù)),是目前C++內(nèi)置支持的library。它的底層利用了C++類(lèi)模板和函數(shù)模板的機(jī)制,由三大部分...
    歲與禾閱讀 39,133評(píng)論 3 132
  • 1. STL概述 STL的一個(gè)重要特點(diǎn)是數(shù)據(jù)結(jié)構(gòu)和算法的分離。盡管這是個(gè)簡(jiǎn)單的概念,但這種分離確實(shí)使得STL變得非...
    長(zhǎng)江小楊閱讀 402評(píng)論 0 0
  • 1. STL概述 STL的一個(gè)重要特點(diǎn)是數(shù)據(jù)結(jié)構(gòu)和算法的分離。盡管這是個(gè)簡(jiǎn)單的概念,但這種分離確實(shí)使得STL變得非...
    bilinbilin閱讀 479評(píng)論 0 2