QT学习笔记(八):顺序容器和关联容器
QT學習筆記(八):順序容器和關聯容器
- 一、前言
- 二、容器介紹
- 2.1 順序容器
- 2.2 關聯容器
- 二、順序容器示例
- 三、關聯容器
一、前言
在Qt庫中為我們提供了一系列的基于模板的容器類(container classes)。這些類可以被用來存儲特定類型的項(items)。例如,如果你需要一個大小可以變得QString數組,那么可以使用QVector。
與STL中的容器類相比:這些容器類都是隱式共享的,可重入的,并且在速度上進行了優化,內存占用少,內聯代碼擴展少,從而可以產生更小的可執行文件。此外,當他們被用作只讀容器時,還是線程安全的。
如果不熟悉STL或者更喜歡使用QT 方式來進行編程,那么久可以使用這些容器來代替STL的類。
二、容器介紹
2.1 順序容器
Qt中的容器和STL中的類似,也分為序列式容器和關聯式容器。
順序容器:是指容器中的數據在內存空間中都為一個接一個的線性存儲。
如:QList、QLinkedList、QVector、QStack、QQueue…
2.2 關聯容器
除了序列式容器,Qt中還提供了關聯式容器:因為這些容器儲存的是<鍵,值>對,比如QMap<Key,T>,所以稱為關聯容器。
如:QMap,QMultiMap,QHash,QMultiHash,QSet…
"Multi"容器又支持一個key可以關聯多個value。"Hash"容器通過使用一個hash函數而不是二分搜索提供了更快速的查找操作。
我們常用的順序容器類的總結在下表中:
| QList< T > | 這是最通用的一個容器類。它里面存儲了給定類型T的一個列表,這個列表可以使用下標來訪問。其實,在底層QList被實現為一個數組,確保基于下標的訪問非常快速。可以使用QList::append()和QList::prepend()向鏈表的兩端添加元素,或者使用QList::insert()在鏈表的中間插入元素。并且,和其他容器相比,更重要的是,QList在可執行文件中展開的代碼量是非常少的,是經過高度優化的。QStringList就繼承自QList。 |
| QLinkedList< T > | 這個容器類類似于QList,只不過它是使用迭代器來訪問,而不是下標。當從中間插入時,它的效率比QList還要高。并且,它有更好的迭代器語義。即指向QLinkedList中某個元素的迭代器,只有該元素存在就會一直保持有效,而指向QList中某元素的迭代器,在向QList進行任意插入或刪除時都會導致該迭代器失效。 |
| QVector< T > | 這個容器類會在一塊相鄰的內存中存儲一個給定類型的值的數組。在一個vector的前端或中間插入是非常慢的,因為這會導致大量現存的元素移動以為新的元素騰出位置。 |
| QStack< T > | 這個容器類繼承自QVector,提供了“先入后出”的語義。 |
| QQueue< T > | 這個容器類繼承自QList,提供了“先入先出”的語義。 |
| QSet< T > | 這個容器類提供了不允許有重復值的集合,提供快速的查找效率。 |
| QMap<Key, T> | 這個容器類提供了一個字典形式的容器,它會將Key類型的值映射到T類型的value上。通常情況下,每一個key只關聯一個值。并且,QMap會按Key的順序存儲相應的值;所以,如果不關心元素的存儲順序,QHash是一個更好的選擇。 |
| QMaultiMap<Key, T> | 這個容器類繼承自QMap,提供了多值的字典,也就是說,該容器中的一個key可以關聯多個值。 |
| QHash<Key, T> | 這個容器類的API和QMap幾乎一樣,但它提供了更快速的查找操作。并且,該類會按任意的順序存儲值。 |
| QMultiHash<Key, T> | 這個容器類繼承自QHash,提供了多值hash表。 |
二、順序容器示例
QList 是最常用的容器類,盡管它在底層被實現為一個array-list,但它為我們提供了非常快速的添加操作,包括在頭部添加和在尾部添加。當然,如果你確實需要一個linked-list,可以使用QLinkedList ,如果你想確保你的元素占用連續的內存空間,可以使用QVector。而QStack和QQueue是兩個提供了LIFO和FIFO語義的方便類。
QList 提供下標索引方式訪問數據項,如同數組一樣,也提供 at() 函數,例如:
QT 控制臺程序,QList類 相關操作示例:
#include <QCoreApplication> #include <QList> #include <QDebug> int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QList<QString> list;list << "aa" << "bb" << "cc"; // 插入項目if(list[1] == "bb") list[1] = "ab";list.replace(2, "bc"); // 將“cc”換為“bc”qDebug() << "the list is: "; // 輸出整個列表for(int i=0; i<list.size(); ++i){qDebug() << list.at(i); // 現在列表為aa ab bc}list.append("dd"); // 在列表尾部添加list.prepend("mm"); // 在列表頭部添加QString str = list.takeAt(2); // 從列表中刪除第3個項目,并獲取它qDebug() << "at(2) item is: " << str;qDebug() << "the list is: ";for(int i=0; i<list.size(); ++i){qDebug() << list.at(i); // 現在列表為mm aa bc dd}list.insert(2, "mm"); // 在位置2插入項目list.swap(1,3); // 交換項目1和項目3qDebug() << "the list is: ";for(int i=0; i<list.size(); ++i){qDebug() << list.at(i); // 現在列表為mm bc mm aa dd}qDebug() << "contains 'mm' ?" << list.contains("mm"); // 列表中是否包含“mm”qDebug() << "the 'mm' count: " << list.count("mm"); // 包含“mm”的個數// 第一個“mm”的位置,默認從位置0開始往前查找,返回第一個匹配的項目的位置qDebug() << "the first 'mm' index: " << list.indexOf("mm");// 第二個“mm”的位置,我們指定從位置1開始往前查找qDebug() << "the second 'mm' index: " << list.indexOf("mm", 1);return a.exec(); }運行結果:
三、關聯容器
QT 控制臺程序,QMap類 相關操作示例:
運行結果:
總結
以上是生活随笔為你收集整理的QT学习笔记(八):顺序容器和关联容器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: numpy将bool值转换成数值
- 下一篇: QT学习笔记(二):QT MinGW 和