日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

QT学习笔记(八):顺序容器和关联容器

發(fā)布時(shí)間:2024/7/23 c/c++ 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QT学习笔记(八):顺序容器和关联容器 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

QT學(xué)習(xí)筆記(八):順序容器和關(guān)聯(lián)容器

    • 一、前言
    • 二、容器介紹
      • 2.1 順序容器
      • 2.2 關(guān)聯(lián)容器
    • 二、順序容器示例
    • 三、關(guān)聯(lián)容器

一、前言

在Qt庫(kù)中為我們提供了一系列的基于模板的容器類(container classes)。這些類可以被用來(lái)存儲(chǔ)特定類型的項(xiàng)(items)。例如,如果你需要一個(gè)大小可以變得QString數(shù)組,那么可以使用QVector。

與STL中的容器類相比:這些容器類都是隱式共享的,可重入的,并且在速度上進(jìn)行了優(yōu)化,內(nèi)存占用少,內(nèi)聯(lián)代碼擴(kuò)展少,從而可以產(chǎn)生更小的可執(zhí)行文件。此外,當(dāng)他們被用作只讀容器時(shí),還是線程安全的。
如果不熟悉STL或者更喜歡使用QT 方式來(lái)進(jìn)行編程,那么久可以使用這些容器來(lái)代替STL的類。

二、容器介紹

2.1 順序容器

Qt中的容器和STL中的類似,也分為序列式容器和關(guān)聯(lián)式容器。
順序容器:是指容器中的數(shù)據(jù)在內(nèi)存空間中都為一個(gè)接一個(gè)的線性存儲(chǔ)。
如:QList、QLinkedList、QVector、QStack、QQueue…

2.2 關(guān)聯(lián)容器

除了序列式容器,Qt中還提供了關(guān)聯(lián)式容器:因?yàn)檫@些容器儲(chǔ)存的是<鍵,值>對(duì),比如QMap<Key,T>,所以稱為關(guān)聯(lián)容器。
如:QMap,QMultiMap,QHash,QMultiHash,QSet…
"Multi"容器又支持一個(gè)key可以關(guān)聯(lián)多個(gè)value。"Hash"容器通過使用一個(gè)hash函數(shù)而不是二分搜索提供了更快速的查找操作。

我們常用的順序容器類的總結(jié)在下表中:

類介紹
QList< T >這是最通用的一個(gè)容器類。它里面存儲(chǔ)了給定類型T的一個(gè)列表,這個(gè)列表可以使用下標(biāo)來(lái)訪問。其實(shí),在底層QList被實(shí)現(xiàn)為一個(gè)數(shù)組,確保基于下標(biāo)的訪問非常快速。可以使用QList::append()和QList::prepend()向鏈表的兩端添加元素,或者使用QList::insert()在鏈表的中間插入元素。并且,和其他容器相比,更重要的是,QList在可執(zhí)行文件中展開的代碼量是非常少的,是經(jīng)過高度優(yōu)化的。QStringList就繼承自QList。
QLinkedList< T >這個(gè)容器類類似于QList,只不過它是使用迭代器來(lái)訪問,而不是下標(biāo)。當(dāng)從中間插入時(shí),它的效率比QList還要高。并且,它有更好的迭代器語(yǔ)義。即指向QLinkedList中某個(gè)元素的迭代器,只有該元素存在就會(huì)一直保持有效,而指向QList中某元素的迭代器,在向QList進(jìn)行任意插入或刪除時(shí)都會(huì)導(dǎo)致該迭代器失效。
QVector< T >這個(gè)容器類會(huì)在一塊相鄰的內(nèi)存中存儲(chǔ)一個(gè)給定類型的值的數(shù)組。在一個(gè)vector的前端或中間插入是非常慢的,因?yàn)檫@會(huì)導(dǎo)致大量現(xiàn)存的元素移動(dòng)以為新的元素騰出位置。
QStack< T >這個(gè)容器類繼承自QVector,提供了“先入后出”的語(yǔ)義。
QQueue< T >這個(gè)容器類繼承自QList,提供了“先入先出”的語(yǔ)義。
QSet< T >這個(gè)容器類提供了不允許有重復(fù)值的集合,提供快速的查找效率。
QMap<Key, T>這個(gè)容器類提供了一個(gè)字典形式的容器,它會(huì)將Key類型的值映射到T類型的value上。通常情況下,每一個(gè)key只關(guān)聯(lián)一個(gè)值。并且,QMap會(huì)按Key的順序存儲(chǔ)相應(yīng)的值;所以,如果不關(guān)心元素的存儲(chǔ)順序,QHash是一個(gè)更好的選擇。
QMaultiMap<Key, T>這個(gè)容器類繼承自QMap,提供了多值的字典,也就是說(shuō),該容器中的一個(gè)key可以關(guān)聯(lián)多個(gè)值。
QHash<Key, T>這個(gè)容器類的API和QMap幾乎一樣,但它提供了更快速的查找操作。并且,該類會(huì)按任意的順序存儲(chǔ)值。
QMultiHash<Key, T>這個(gè)容器類繼承自QHash,提供了多值hash表。

二、順序容器示例


QList 是最常用的容器類,盡管它在底層被實(shí)現(xiàn)為一個(gè)array-list,但它為我們提供了非常快速的添加操作,包括在頭部添加和在尾部添加。當(dāng)然,如果你確實(shí)需要一個(gè)linked-list,可以使用QLinkedList ,如果你想確保你的元素占用連續(xù)的內(nèi)存空間,可以使用QVector。而QStack和QQueue是兩個(gè)提供了LIFO和FIFO語(yǔ)義的方便類。
QList 提供下標(biāo)索引方式訪問數(shù)據(jù)項(xiàng),如同數(shù)組一樣,也提供 at() 函數(shù),例如:

QList<QString> list; list << "one" << "two" << "three"; QString str1=list[1]; //str1=="two" QString str0=list.at(0); //str0=="one"

QT 控制臺(tái)程序,QList類 相關(guān)操作示例:

#include <QCoreApplication> #include <QList> #include <QDebug> int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QList<QString> list;list << "aa" << "bb" << "cc"; // 插入項(xiàng)目if(list[1] == "bb") list[1] = "ab";list.replace(2, "bc"); // 將“cc”換為“bc”qDebug() << "the list is: "; // 輸出整個(gè)列表for(int i=0; i<list.size(); ++i){qDebug() << list.at(i); // 現(xiàn)在列表為aa ab bc}list.append("dd"); // 在列表尾部添加list.prepend("mm"); // 在列表頭部添加QString str = list.takeAt(2); // 從列表中刪除第3個(gè)項(xiàng)目,并獲取它qDebug() << "at(2) item is: " << str;qDebug() << "the list is: ";for(int i=0; i<list.size(); ++i){qDebug() << list.at(i); // 現(xiàn)在列表為mm aa bc dd}list.insert(2, "mm"); // 在位置2插入項(xiàng)目list.swap(1,3); // 交換項(xiàng)目1和項(xiàng)目3qDebug() << "the list is: ";for(int i=0; i<list.size(); ++i){qDebug() << list.at(i); // 現(xiàn)在列表為mm bc mm aa dd}qDebug() << "contains 'mm' ?" << list.contains("mm"); // 列表中是否包含“mm”qDebug() << "the 'mm' count: " << list.count("mm"); // 包含“mm”的個(gè)數(shù)// 第一個(gè)“mm”的位置,默認(rèn)從位置0開始往前查找,返回第一個(gè)匹配的項(xiàng)目的位置qDebug() << "the first 'mm' index: " << list.indexOf("mm");// 第二個(gè)“mm”的位置,我們指定從位置1開始往前查找qDebug() << "the second 'mm' index: " << list.indexOf("mm", 1);return a.exec(); }

運(yùn)行結(jié)果:

三、關(guān)聯(lián)容器


QT 控制臺(tái)程序,QMap類 相關(guān)操作示例:

#include <QCoreApplication> #include <QMap> #include <QMultiMap> #include <QDebug> int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QMap<QString, int> map;map["one"] = 1; // 向map中插入("one",1)map["three"] = 3;map.insert("seven", 7); // 使用insert()函數(shù)進(jìn)行插入// 獲取鍵的值,使用“[ ]”操作符時(shí)如果map中沒有該鍵,那么會(huì)自動(dòng)插入int value1 = map["six"];qDebug() << "value1:" << value1;qDebug() << "contains 'six' ?" << map.contains("six");// 使用value()函數(shù)獲取鍵的值,這樣當(dāng)鍵不存在時(shí)不會(huì)自動(dòng)插入int value2 = map.value("five");qDebug() << "value2:" << value2;qDebug() << "contains 'five' ?" << map.contains("five");// 當(dāng)鍵不存在時(shí),value()默認(rèn)返回0,這里可以設(shè)定該值,比如這里設(shè)置為9int value3 = map.value("nine", 9);qDebug() << "value3:" << value3;// map默認(rèn)是一個(gè)鍵對(duì)應(yīng)一個(gè)值,如果重新給該鍵設(shè)置了值,那么以前的會(huì)被擦除map.insert("ten", 10);map.insert("ten", 100);qDebug() << "ten: " << map.value("ten");// 可以使用insertMulti()函數(shù)來(lái)實(shí)現(xiàn)一鍵多值,然后使用values()函數(shù)來(lái)獲取值的列表map.insertMulti("two", 2);map.insertMulti("two", 4);QList<int> values = map.values("two");qDebug() << "two: " << values;// 也可以使用QMultiMap類來(lái)實(shí)現(xiàn)一鍵多值QMultiMap<QString, int> map1, map2, map3;map1.insert("values", 1);map1.insert("values", 2);map2.insert("values", 3);// 可以進(jìn)行相加,這樣map3的“values”鍵將包含2,1,3三個(gè)值map3 = map2 + map1;QList<int> myValues = map3.values("values");qDebug() << "the values are: ";for (int i=0; i<myValues.size(); ++i) {qDebug() << myValues.at(i);}return a.exec(); }

運(yùn)行結(jié)果:

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的QT学习笔记(八):顺序容器和关联容器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。