我們經常對不同型別的容器做類似的操作。由此而生了通用演算法。qt實現了其中最常用的13個。
下面對列舉這些通用演算法:
(1)排序
qsort使用快速排序演算法,將乙個元素序列排成公升序。
qstablesort也能完成類似的排序操作,但是能夠確保值相等的元素在排序的前後相對順序不變。
(2)搜尋
對於有序容器,通用演算法qbinaryfind使用二分搜尋演算法,在容器中快速搜尋乙個等於某個指定值的元素,返回乙個指向該元素的迭代器。如果容器中有多個元素等於指定值,其中任何乙個可能被返回。
qlowerbound和qupperbound卻具有更加確定的搜尋結果。qlowerbound在乙個元素序列中尋找第乙個等於(或者大於)指定值的元素,返回乙個指向該元素的迭代器。而qupperbound在乙個元素序列中尋找最後乙個大於指定值的元素,返回指向該元素的乙個迭代器。
無論容器是否有序,qfind在容器中逐個搜尋與某個指定值相等的元素,並返回乙個指向該元素的迭代器。
(3)修改容器的元素
qfill將乙個元素序列中的每個元素設定為乙個相同的值。
qcopy按照從前向後的順序將乙個元素序列複製到所在容器的其他位置或者另外乙個容器中。
qcopybackward按照從後向前的順序完成類似的操作。
(4)其他
qcount計算某個值在容器中出現的次數。
qdeleteall呼叫c++運算子delete,析構容器中的元素。
qequal比較兩個元素序列是否相等。
qswap調換兩個元素的值。
特別說明:
普通陣列可以被看作容器,而普通指標可以被看作迭代器。當我們使用普通c++指標來訪問乙個普通陣列時,其格式等同於通過迭代器來訪問乙個容器。因此可以使用qt中的通用演算法來處理普通陣列。
例如,下面的**將陣列的元素全部賦為乙個相同的值:
int a = ;
qfill(a, a+5, 10 );
關於函子
我們將這些能夠像函式一樣被「呼叫」的語法元素統稱為函子(function object或functor)。 c語言中的函式、函式指標、具有函式呼叫格式的巨集是函子。在c++語言中,如果乙個類或者類模板過載了函式呼叫運算子,它們的物件也可以像函式那樣被「呼叫」,因而這些物件(而不是類或類模板)也是函子。
和普通函式相比,選擇類或者類模板的物件作為函子具有以下優勢:
(1)類或者類模板具有資料成員,可被用來存放函子所要操作的資料,或者用來記錄函子的執行狀態。
(2)類模板可以處理不同型別的資料,這是普通函式所不具備的。
(3)類或者類模板可以使用**內聯(inline )技術,減少函式呼叫開銷,執行的速度要比普通函式快。
qt中定義了兩個函子qless和qgreater。給定兩個元素,這兩個函子返回的bool值恰好相反。僅用於呼叫qsort或者qstablesort時,傳遞乙個qless物件,將以公升序排列乙個元素序列。傳遞乙個qgreater物件,將以降序排列。
這兩個函子在其內部使用運算子「<」比較兩個元素,這實際上要求容器元素的型別滿足以下條件:
給定兩個元素,第一,能夠使用運算子「<」比較這兩個元素,第二,比較所得結果和邏輯上的結果一致。
c++基本型別都滿足這一條件,但是使用者自定義的型別卻不一定。因此需要重新定義乙個函子,通過過載函式operator()來實現得到結果與邏輯結果一致的要求。
例如:
struct indirectcompare
bool operator() (int x, int y) const
bool operator() (int x, const qstring & a) const
bool operator() (const qstring & a, int x) const
const qvector& v;
}int main()
Qt容器類之三 通用演算法
在標頭檔案中,qt提供了一些全域性的模板函式,這些函式是可以使用在容器上的十分常用的演算法。我們可以在任何提供了stl風格迭代器的容器類上用這些演算法,包括qlist qlinkedlist qvector qmap和qhash。如果在目標平台上可以使用stl,那麼可以使用stl的演算法來代替qt的...
Qt的容器類之容器,迭代器
qt中的容器被分為兩個大類 容器元素是乙個值的,比如qvector,以及容器元 素是乙個 key,value 對的,比如qmap。1 第一大類中,qvector將其所有元素存放在一塊連續的記憶體中。隨機訪問的速度很快,但是插入 刪除操作很慢。qstack是qvector的子類,實現棧的功能。除了具有...
QT容器類(三) 之 QMap QHash
一 介紹 qmap qmap中的key value對是公升序排列的 插入和刪除操作中都可以使用運算子,其下標為key 為避免建立不必要的空值,推薦用vlaue 而不是從qmap中取值。qmap中的k和t除了要求具備預設建構函式 拷貝建構函式和賦值運算子外,k還必須支援operator keys va...