Qt容器類之三 通用演算法

2022-02-20 15:24:50 字數 3038 閱讀 4770

在標頭檔案中,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 搜尋 對於有序容器...