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() 函数,例如:

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

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类 相关操作示例:

#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()函数进行插入// 获取键的值,使用“[ ]”操作符时如果map中没有该键,那么会自动插入int value1 = map["six"];qDebug() << "value1:" << value1;qDebug() << "contains 'six' ?" << map.contains("six");// 使用value()函数获取键的值,这样当键不存在时不会自动插入int value2 = map.value("five");qDebug() << "value2:" << value2;qDebug() << "contains 'five' ?" << map.contains("five");// 当键不存在时,value()默认返回0,这里可以设定该值,比如这里设置为9int value3 = map.value("nine", 9);qDebug() << "value3:" << value3;// map默认是一个键对应一个值,如果重新给该键设置了值,那么以前的会被擦除map.insert("ten", 10);map.insert("ten", 100);qDebug() << "ten: " << map.value("ten");// 可以使用insertMulti()函数来实现一键多值,然后使用values()函数来获取值的列表map.insertMulti("two", 2);map.insertMulti("two", 4);QList<int> values = map.values("two");qDebug() << "two: " << values;// 也可以使用QMultiMap类来实现一键多值QMultiMap<QString, int> map1, map2, map3;map1.insert("values", 1);map1.insert("values", 2);map2.insert("values", 3);// 可以进行相加,这样map3的“values”键将包含2,1,3三个值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();
}

运行结果:

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

  1. QT学习笔记(九):遍历容器-迭代器(iterators)

    QT学习笔记(九):遍历容器-迭代器(iterators) 遍历容器 : 1.Jave风格: 2.STL风格: 3.foreach 关键字: 遍历容器 : 遍历一个容器可以使用迭代器(iterator ...

  2. OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7888 ...

  3. QT学习笔记之对话框

    QT学习笔记之对话框 对话框是一种用户界面(窗口),它的主要功能是输出信息和接收用户的输入.在每个对话框内一般都有一些控件,对话框依靠这些控件与用户进行交互. 1)       模式对话框:用户只能与 ...

  4. QT学习笔记(摘抄)

    QT学习笔记-1.QT主要的对象 说来惭愧学习c++很长时间了一直没有使用c++开发过软件界面 所以现在想认认真真的学习一个c++图形界面框架库 本来想学习Xwidget但是这个资料不大好找 有啥问题 ...

  5. 【QT学习笔记】基于QT的天气预报

    [QT学习笔记]基于QT的天气预报 前言 那就开始吧! 先看一下效果 颜面最重要,画个UI 构造实现 怎么开始? 开始解析数据 关于城市切换 ok 最后源码献上 感谢 前言 学习qt已经有一段时间了, ...

  6. Qt学习笔记之数据库

    一.数据库简介 1.1.数据和数据库(DB) 用计算机进行数据处理,首先就要把信息以数据形式存储到计算机中,故数据是可以被计算机接受和处理的符号.根据所表示的信息特征不同,数据有不同的类别,如数字.文 ...

  7. QT学习笔记(七):定时器事件的3种常用使用方式

    QT学习笔记(七):定时器事件的2种常用使用方式 Qt中定时器的使用有2种方法:一种是使用QObject类提供的定时器通过重载 timerEvent 事件处理过程函数,一种就是使用QTimer类. 其 ...

  8. QT学习笔记(五):Qt5的8种标准对话框示例

    QT学习笔记(五):Qt5的8种标准对话框示例 前言 实例展示 1.颜色对话框 2.文件对话框 3.字体对话框 4.输入对话框 5.消息对框 6.进度对话框 7.错误信息对话框 8.向导对话框. 前言 ...

  9. 黑马程序员_java自学学习笔记(八)----网络编程

    黑马程序员_java自学学习笔记(八)----网络编程 android培训. java培训.期待与您交流! 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无 ...

最新文章

  1. python pandas 独热编码
  2. 深入理解JVM读书笔记--内存管理
  3. 全球32家人工智能独角兽公司
  4. C# 程序打包成安装项目
  5. [Inside HotSpot] UseParallelGC和UseParallelOldGC的区别
  6. random输出1到10之间_第43P,随机数,Python内置库之random
  7. Leetcode 1559二维网格图中探测环 技巧DFS|剪枝
  8. 如何在CentOS 7上安装Varnish Cache
  9. 家居建材行业信息化管理需内外兼修
  10. 【Python实例第25讲】稳健的 vs 经验的协方差估计
  11. 图解 Git,一目了然!
  12. 三包围结构的字是什么样的_清桦学书之结构篇——包围结构。
  13. java cucumber_Cucumber框架入门篇
  14. VS编译器的简单操作
  15. Leaflet--建设移动设备友好的互动地图
  16. 一文回顾腾讯数字生态大会·微搭低代码专场
  17. [Software]基于Windriver的PCIe驱动开发
  18. HTTP协议:工作原理
  19. python筛选同义词_Python-比较同义词NLTK
  20. Unity,C#版的动画曲线,Tween:EaseIn,EaseOut,EaseInOut(语法逻辑整理版本,含测试代码)

热门文章

  1. iphone版 天行skyline_Skyline QT
  2. Docker系列之二:基于容器的自动构建
  3. 实时数据产品实践——美团大交通战场沙盘
  4. 海马体what where记忆推理模型
  5. Nginx 简介和使用
  6. Zookeeper默认占用8080端口问题以及常见启动错误的解决
  7. go and git 代理
  8. 概率校准与Brier分数
  9. VC/VS开发问题集锦
  10. windows和linux中搭建python集成开发环境IDE——如何设置多个python环境