最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你深入了解Qt中的順序容器類與關(guān)聯(lián)容器類

 更新時間:2024年04月28日 10:02:50   作者:三號原子  
Qt中也有很多容器類,他們在存取速度、內(nèi)存開銷等方面進行了優(yōu)化,使用起來更輕量級、更便捷,下面就跟隨小編一起來學習一下它們的具體使用吧

前言

眾所周知,C++中存在很多容器類。同樣,Qt中也有很多容器類,而且Qt中的容器類在存取速度、內(nèi)存開銷等方面進行了優(yōu)化,使用起來更輕量級、更便捷還有很重要的一點--它們是線程安全的。

具體介紹容器之前,先要了解 Qt容器的一個特性。Qt容器類都是基于模板的類,比如常用的OList<T>,這里的T表示的就是具體的類型,而且必須是可賦值的數(shù)據(jù)類型。這意味著該數(shù)據(jù)類型必須提供一個默認的構(gòu)造函數(shù)、賦值構(gòu)造函數(shù)和賦值運算符。所以,像int、double、QString、QTime等類型可以存儲到容器中,而QObiect及其他一些子類如QWidget、QDialog等無法直接存儲到容器中,但是可以使用指針類型進行替代,如OList<OButton*>list。

基于不同的底層數(shù)據(jù)結(jié)構(gòu),可以將容器類分為兩類:順容器類和關(guān)聯(lián)容器類。

1.順序容器類

Qt中的順序容器類有QList、QLinkedList、QVector、QStack和QQueue,每個類中都有大量的API。在講解的時候,只重點介紹比較有代表性的,對于其他更多API的用法,可以查閱官方幫助文檔來進行拓展。

1.1QList

QList是十分常用的容器類,它是以數(shù)組列表的形式實現(xiàn)的,可以理解為它就是C中的數(shù)組。QList以索引的方式對數(shù)據(jù)項進行訪問,其查找數(shù)據(jù)速度以及在尾部操作數(shù)據(jù)的速度,都是非??斓?。

QList中用于添加、插人、查詢、替換、移動、刪除數(shù)據(jù)項的函數(shù)有append()、prepend()、insert()、contains()、replace()、move()、swap()、removeAt()removeFirst(、removeLast()和clear()等:

OList<QString> list;
// 添加元素
list.append("one");
list << "Two" << "Four";
list.insert(2,"Three");
//根據(jù)索引值訪問元素
Rstring v=list[0]
//等價于
list.at(0)
// 查詢元素
bool has = list.contains("one");
// 替換
list.replace(0,"zero");
// 交換
list.swap(0,1);
// 移動
list.move(0,1);
// 刪除
list.removeat(0)list.removeLast();
list.clear();

1.2QLinkedList

QLinkedList是鏈式列表,其數(shù)據(jù)項基于非連續(xù)內(nèi)存存儲,也就是數(shù)據(jù)結(jié)構(gòu)中的鏈式存儲,鑒于該特點,其插入和刪除數(shù)據(jù)的效率非常高。

相關(guān)API的用法同QList幾乎一致,不贅述。有一點需要注意,QLinkedList不提供基于索引值的對外接口。

1.3QVector

QVector<T>是一個提供動態(tài)數(shù)組的模板類

QVector 是 Qt 的通用容器類之一。它將其數(shù)據(jù)項存儲在相鄰的內(nèi)存位置,并提 供 基 于 索 引 的 快 速 訪 問。QVector 提 供 了 與 QList 類 似 的 API 和 功 能, 同 樣 不贅述。但有一點需要注意,QVector<T> 通常比 QList<T> 具有更好的性能,因為 QVector<T> 總是將其數(shù)據(jù)項存儲在內(nèi)存中。

1.4 QStack

Stack 是提供類似于堆棧的后進先出(Last In First Out, LIFO)操作的容器類,主要提供了 push() 和 pop() 兩個接口函數(shù)。

#include <QStack>
QStack<int> stack;
stack.push(1);
stack.push(2);
stack.push(3);
while (!stack.isEmpty())
// 基于后進先出的規(guī)則,會輸出 3 2 1
cout << stack.pop() << endl;

1.5QQueue

QQueue 是提供類似于隊列先進先出(First In First Out, FIFO)操作的容器類。主要提供了 enqueue() 和 dequeue() 兩個接口函數(shù)。

QQueue<int> queue;
queue.enqueue (1);
queue.enqueue(2);
queue.enqueue (3);
while (!queue.isEmpty())
// 基于先進先出的規(guī)則,會輸出 1 2 3
qDebug() << queue.dequeue() << endl

2.關(guān)聯(lián)容器類 

2.1QSet

QSet 是基于散列表的集合模板類。作為一個簡單的容器,它跟 QList 很像,不過有一點需要特別注意,由于它底層的數(shù)據(jù)結(jié)構(gòu)是基于散列表的,存儲進來的數(shù)據(jù)是無序的。對于散列,有一個很重要的嘗試就是,可以在散列表中非??斓夭檎业侥繕酥?。還有一點需要注意,QSet 內(nèi)部是用 QHash 實現(xiàn)的。

QSet<QString>set;
// 添加
set << "A" << "B" << "C";
// 插入
set.insert("D");
// 每次輸出,元素順序都不同,因為 hash 值每次都不同
qDebug() << set;qDebug() << set.count();
// 判斷
if (!set.isEmpty() && set.contains("D")){
    set.remove("D");
}
qDebug() << set;
// 獲取所有值
QList<QString>list = set.values();
qDebug() << list;
// 轉(zhuǎn)換成 
QListlist = set.toList();
qDebug() << list

2.2QMap

QMap<Key, T> 以映射的方式完成數(shù)據(jù)存儲,Key 對應(yīng) T,成對出現(xiàn)。對于 Key的類型,一般情況下使用 QString 來表示,因為它有一個硬性要求,就是 Key 必須是可進行哈希運算的。QMap 存儲數(shù)據(jù)會按照鍵的順序,這是因為在底層采用了哈希表 + 鏈表的組合結(jié)構(gòu),這會導(dǎo)致存取速度下降。如果只看中速度而不在乎存儲順序,可以使用 QHash。

QMap<QString,int> map;
// 添加數(shù)據(jù)
map["one"] = 1;
map["two"] = 2;
// 插入數(shù)據(jù)
map.insert("three",3);
qDebug() << map;
// 通過 key 獲取對應(yīng)的數(shù)據(jù)
int num = map["one"];
qDebug() << num;
// 通過 key 獲取對應(yīng)數(shù)據(jù)的其他方式
num = map.value("two");
qDebug() << num;
// 根據(jù) key 刪除數(shù)據(jù)
map.remove("one");
// 根據(jù) key 獲取對應(yīng)的值,如果沒有這個 key,則得到后邊給出的默認值
num = map.value("one",0);
qDebug() << num;
// 獲取所有的 k
eysQList<QString>keys = map.keys();
qDebug() << keys;
// 獲取所有的 
valuesQList<int> values = map.values();
qDebug() << values

2.3QMultiMap 

MultiMap 是 QMap 的子類,是用于處理多值映射的便利類。多值映射就是一個鍵可以對應(yīng)多個值。QMap 正常情況下不允許多值映射,除非使用QMap::insertMulti() 添加鍵值對。基于繼承關(guān)系的存在,QMap 的大多數(shù)函數(shù)在 QMultiMap 都是可用的, 但是有幾個特殊的函數(shù)需要關(guān)注QMultiMap::insert() 等效于 QMap::insertMulti(),QMultiMap::replace() 等效于 QMap::insert()。

QMultiMap<QString, int> map1, map2, map3;
map1.insert("A", 10);
// 再次插入鍵值對,等于是字典中有兩個鍵值對
map1.insert("A", 20); // map1.size() == 2
qDebug() << map1;
map2.insert("A", 30); // map2.size() == 1
qDebug() << map2;
// 支持 + 完成拼接
map3 = map1 + map2; // map3.size() == 3
qDebug() << map3;
// 只能得到最新插入的值,而且不支持以 d[key] 的方式訪問數(shù)據(jù)
qDebug() << map3.value("A")

2.4 QHash

QHash 是基于散列表來實現(xiàn)字典功能的模板類,QHash<Key,T> 存儲的鍵值對具有非??斓牟檎宜俣取Hash 與 QMap 的功能和用法相似,區(qū)別在于以下幾點。

QHash 比 QMap 的查找速度快。

在 QMap 上遍歷時,數(shù)據(jù)項是按照鍵排序的,而 QHash 的數(shù)據(jù)項是按照任意順序排列的。

QMap 的鍵必須提供“<”運算符,QHash 的鍵必須提供“==”運算符和一個名稱為 qHash() 的全局散列函數(shù)。

到此這篇關(guān)于一文帶你深入了解Qt中的順序容器類與關(guān)聯(lián)容器類的文章就介紹到這了,更多相關(guān)Qt容器類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中的QCommandLineParser簡介

    C++中的QCommandLineParser簡介

    這篇文章主要介紹了QCommandLineParser是Qt框架中的一個類,用于簡化命令行參數(shù)的解析和處理,它支持定義命令行選項、解析參數(shù)、驗證輸入有效性,并自動生成幫助文本,適用于各種需要命令行輸入的應(yīng)用程序
    2024-09-09
  • c++ 獲取數(shù)字字符串的子串數(shù)值性能示例分析

    c++ 獲取數(shù)字字符串的子串數(shù)值性能示例分析

    這篇文章主要為大家介紹了c++ 獲取數(shù)字字符串的子串數(shù)值示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • C語言中判斷一個char*是不是utf8編碼

    C語言中判斷一個char*是不是utf8編碼

    這篇文章主要介紹了C語言中判斷一個char*是不是utf8編碼的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • c++結(jié)構(gòu)體用memcpy賦值問題

    c++結(jié)構(gòu)體用memcpy賦值問題

    本文總結(jié)了在C++中使用memcpy對結(jié)構(gòu)體賦值時需要考慮的問題,包括POD類型、虛函數(shù)、非POD成員、自定義構(gòu)造/析構(gòu)函數(shù)以及指針成員等,具有一定的參考價值,感興趣的可以了解一下
    2026-01-01
  • C語言深入淺出講解順序表的實現(xiàn)

    C語言深入淺出講解順序表的實現(xiàn)

    線性表是最簡單的數(shù)據(jù)結(jié)構(gòu),而順序表又是最簡單的線性表,其基本思想是用一段地址連續(xù)的儲存單元依次存儲線性表的數(shù)據(jù)元素,比如我們常用的一維數(shù)組,下面代碼實現(xiàn)了順序表的定義以及基本操作
    2022-04-04
  • c++ Bellman-Ford算法的具體實現(xiàn)

    c++ Bellman-Ford算法的具體實現(xiàn)

    Bellman-Ford算法用于解決有邊數(shù)限制的最短路問題,且可以應(yīng)對有負邊權(quán)的圖,本文主要介紹了c++ Bellman-Ford算法的具體實現(xiàn),感興趣的可以了解一下
    2021-06-06
  • C++改變編程入口為main函數(shù)

    C++改變編程入口為main函數(shù)

    這篇文章主要介紹了C++改變編程入口為main函數(shù)的方法的相關(guān)資料,需要的朋友可以參考下
    2015-06-06
  • C語言 文件的打開與關(guān)閉詳解及示例代碼

    C語言 文件的打開與關(guān)閉詳解及示例代碼

    本文主要介紹C語言 文件的基礎(chǔ)知識,這里整理了相關(guān)資料及示例代碼,有興趣的小伙伴可以參考下
    2016-08-08
  • C++處理輸入字符串并轉(zhuǎn)為數(shù)組的操作

    C++處理輸入字符串并轉(zhuǎn)為數(shù)組的操作

    這篇文章主要介紹了C++處理輸入字符串并轉(zhuǎn)為數(shù)組的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • C++中based for循環(huán)的實現(xiàn)

    C++中based for循環(huán)的實現(xiàn)

    C++中的范圍for循環(huán)是一種簡潔的遍歷容器的方法,本文主要介紹了C++中based for循環(huán)的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2025-02-02

最新評論

福鼎市| 买车| 尚义县| 屯门区| 临漳县| 鄄城县| 北碚区| 榆林市| 富锦市| 莆田市| 平潭县| 慈溪市| 乐平市| 宜春市| 锡林郭勒盟| 邛崃市| 临沂市| 南昌县| 翁牛特旗| 宜丰县| 梁山县| 浮梁县| 宣城市| 巴彦淖尔市| 溧水县| 尼勒克县| 禄劝| 娄底市| 绥滨县| 拜城县| 乐安县| 南皮县| 都匀市| 偃师市| 墨玉县| 阳东县| 乡宁县| 镇平县| 东乌| 大安市| 新丰县|