在標頭檔案中,qt提供了一些全域性的模板函式,這些函式是可以使用在容器上的十分常用的演算法。我們可以在任何提供了stl風格迭代器的容器類上用這些演算法,包括qlist、qlinkedlist、qvector、qmap和qhash。如果在目標平台上可以使用stl,那麼可以使用stl的演算法來代替qt的這些演算法,因為stl提供了更多的演算法,而qt只提供了其中最重要的一些演算法。
在歷史上,qt曾經提供的函式是許多stl演算法函式的直接等價物。從qt 5.0開始,qt鼓勵我們直接使用stl中可用的實現;大多數qt已經被棄用(儘管它們仍然可以用於保持舊的**編譯,但會有警告)。
大多數情況下,使用廢棄的qt演算法函式的應用程式可以很容易地移植到使用等效的stl函式。你需要
新增#include 標頭檔案,並將qt函式替換為stl對應函式,如下表所示。
qt function
stl function
qbinaryfind
std::binary_search | std::lower_bound
qcopy
std::copy
qcopybackward
std::copy_backward
qequal
std::equal
qfill
std::fill
qfind
std::find
qcount
std::count
qsort
std::sort
qstablesort
std::stable_sort
qlowerbound
std::lower_bound
qupperbound
std::upper_bound
qless
std::less
qgreater
std::greater
下面對其中幾個常用的演算法進行演示,可以在幫助索引中檢視generic algorithms關鍵字來了解其他的演算法。
(1)排序
排序演算法的示例如下:
//使用快速排序演算法對list進行公升序排序,排序後兩個12的位置不確定
qlistlist1;
list1 << 33 << 12 << 68 << 6 << 12;
std::sort(list1.begin(), list1.end());
qdebug() << list1; // 輸出:(6, 12, 12, 33, 68)
//使用一種穩定排序演算法對list2進行公升序排序,排序前在前面的12,排序後依然在前面
qlistlist2;
list2 << 33 << 12 << 68 << 6 << 12;
std::stable_sort(list2.begin(), list2.end());
qdebug() << list2; // 輸出:(6, 12, 12, 33, 68)
//使用qsort()函式和std::greater演算法中使list3反向排序
qlistlist3;
list3 << 33 << 12 << 68 << 6 << 12;
qsort(list3.begin(), list3.end(), std::greater()); //qt5已棄用
qdebug() << list3; // 輸出:(68, 33, 12, 12, 6)
預設情況下,qsort()將使用 < 運算子進行元素的比較,即公升序。如果需要改為降序,需要將qgreater()當作第三個引數傳給qsort()函式。
(2)查詢
查詢演算法的示例如下:
//使用std::find()從list中查詢"two",返回第乙個對應的值的迭代器,如果沒有找到則返回end()
qstringlist list1;
list1 << "one" << "two" << "three";
qlist::iterator i = std::find(list1.begin(), list1.end(), "two");
qdebug() << *i; //輸出:"two"
//使用qfind()從list中查詢"two",返回第乙個對應的值的迭代器,如果沒有找到則返回end()
qstringlist list2;
list2 << "one" << "two" << "three";
qstringlist::iterator j = qfind(list2.begin(), list2.end(), "two");
qdebug() << *j; //輸出:"two"
另外還有個 qbinaryfind() 函式,其行為很像qfind(),所不同的是,qbinaryfind()是二分查詢演算法,它只適用於查詢排序之後的集合,而qfind()則是標準的線性查詢。通常,二分查詢法使用條件更為苛刻,但是效率也會更高。
(3)複製
複製演算法的示例如下:
//將list1中所有專案複製到vect1中
qstringlist list1;
list1 << "one" << "two" << "three";
qvectorvect1(list1.count());
std::copy(list1.begin(), list1.end(), vect1.begin());
qdebug() << vect1; //輸出:qvector("one", "two", "three")
//將list2中所有專案複製到vect2中
qstringlist list2;
list2 << "one" << "two" << "three";
qvectorvect2(list2.count());
qcopy(list2.begin(), list2.end(), vect2.begin());
qdebug() << vect2; //輸出:qvector("one", "two", "three")
參考:
qt容器中的通用演算法
Redis系列三 通用指令
key其它操作 資料庫通用指令 del keyexists keytype keyexpire key seconds pexpire key milliseconds expireat key timestamp 根據時間戳設定有效期 pexpireat key milliseconds time...
實驗記錄三 通用輸入輸出(GPIO)
之前把全部程式都跑了一次後,得到了導師下一步的安排。例如以下 1.編寫乙個程式。實如今lcd上顯示乙個萬年曆,包含年月日 星期 還有室內的溫度。2.編寫乙個程式,將原來的交通燈改為跑馬燈。期限是這學期。好吧。一學期編兩個程式。還真是從0做起。儘管是用c程式設計,可是用的庫函式卻是對應project開...
Qt的容器類之通用演算法
我們經常對不同型別的容器做類似的操作。由此而生了通用演算法。qt實現了其中最常用的13個。下面對列舉這些通用演算法 1 排序 qsort使用快速排序演算法,將乙個元素序列排成公升序。qstablesort也能完成類似的排序操作,但是能夠確保值相等的元素在排序的前後相對順序不變。2 搜尋 對於有序容器...