【嵌入式——QT】容器类

这篇具有很好参考价值的文章主要介绍了【嵌入式——QT】容器类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

Qt提供了基于模板的容器类,这些容器类可以用于存储指定类型的数据项,Qt的容器类比标准模板库(STL)中的容器类更轻巧、安全和易于使用。它们还是线程安全的,它们作为只读容器时可被多个线程访问。
容器类是基于模板的类,如常用的容器类QList,T是一个具体的类型,可以是int,float等简单类型,也可以是QString,QData等类,但不能是QObject或任何其子类。T必须是一个可以赋值的类型,即T必须是一个缺省的构造函数,一个可复制构造函数的一个赋值运算符。

顺序容器类

QList

QList是最常用的容器,在其前后添加数据非常快,QList以下标索引的方式对数据项进行访问。
常用方法

  • insert():插入元素
  • replace():将索引位置i的元素替换为value
  • removeAt():删除索引位置i的元素
  • move():将索引位置的项从索引位置移动到索引位置
  • swap():用这个列表交换其他列表
  • append():在列表的末尾插入value
  • prepend():在列表的开头插入value
  • removeFirst():删除列表中的第一项
  • removeLast():删除列表中的最后一项
  • size():list大小
  • isEmpty():判断list是空
QList<QString> list;
list << "alpha" << "beta" << "delta";
list.insert(2, "gamma");

QList<QString> list;
list << "A" << "B" << "C" << "D" << "E" << "F";
list.move(1, 4);
// list: ["A", "C", "D", "E", "B", "F"]

QList<QString> list;
list.append("one");
list.append("two");
list.append("three");
// list: ["one", "two", "three"]

QList<QString> list;
list.prepend("one");
list.prepend("two");
list.prepend("three");
// list: ["three", "two", "one"]

迭代器

  • 只读迭代器:QList::const_iterator;
  • 读写迭代器:QList::iterator;
QList<QString> list;
list<<"A"<<"B"<<"C";
QList<QString>::const_iterator item;
for(item = list.constBegin(); item!=list.constEnd(); ++item) {
      qDebug()<<*item;
}

QLinkedList

是链式列表,数据项不是用连续的内存存储的,基于迭代器访问数据,并且插入和删除数据项的操作时间相同。除了不提供基于下标索引的数据项访问外,其他的方法与QList是相同的。
迭代器

  • 只读迭代器:QLinkedList::const_iterator;
  • 读写迭代器:QLinkedList::iterator;

QVector

提供动态数组的功能,以下标索引访问数据,函数接口与QList完全相同,性能比QList更高,QVector数据项是连续存储的。
迭代器

  • 只读迭代器:QVector::const_iterator;
  • 读写迭代器:QVector::iterator;

QStack

类似于堆栈的先进后出操作的容器类。

  • 入栈:push();
  • 出栈:pop();
QStack<int> stack;
stack.push(1);
stack.push(2);
stack.push(3);
while (!stack.isEmpty())
    cout << stack.pop() << Qt::endl;

QQueue

类似于队列先进先出操作的容器类。

  • 入队:enqueue();
  • 出队:dequeue();
QQueue<int> queue;
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
while (!queue.isEmpty())
    cout << queue.dequeue() << Qt::endl;

关联容器类

QMap

提供一个字典,一个键映射到一个值,存储数据是按照键的顺序,如果不在乎存储顺序,使用QHash更快。

map中添加数据

QMap<QString, int> map;
map["one"] = 1;
map["three"] = 3;
map["seven"] = 7;

map.insert("twelve", 12);

根据键查找值

int num1 = map["thirteen"];
int num2 = map.value("thirteen");
//如果找到键为"TIMEOUT"的就返回值,如果没有找到就返回30
int timeout = map.value("TIMEOUT", 30);

迭代器

  • 只读迭代器:QMap<key, T>::const_iterator;
  • 读写迭代器:QMap<key, T>::iterator;
for (QMap<int, QString>::const_iterator it = map.cbegin(), end = map.cend(); it != end; ++it) {
     cout << "The key: " << it.key() << Qt::endl
     cout << "The value: " << it.value() << Qt::endl;
     cout << "Also the value: " << (*it) << Qt::endl;
 }

QMultiMap

支持一个键关联多个值,是QMap的子类。

QMultiMap<QString, int> map1, map2, map3;

map1.insert("plenty", 100);
map1.insert("plenty", 2000);
// map1.size() == 2

map2.insert("plenty", 5000);
// map2.size() == 1

map3 = map1 + map2;
// map3.size() == 3

迭代器

  • 只读迭代器:QMap<key, T>::const_iterator;
  • 读写迭代器:QMap<key, T>::iterator;

QHash

使用散列函数进行查找,查找速度更快,功能和用法与QMap相似。
迭代器

  • 只读迭代器:QHash<key, T>::const_iterator;
  • 读写迭代器:QHash<key, T>::iterator;

QMultiHash

支持一个键关联多个值,使用散列函数进行查找,查找速度更快,是QHash的子类,用法与QMultiMap类似。
迭代器

  • 只读迭代器:QHash<key, T>::const_iterator;
  • 读写迭代器:QHash<key, T>::iterator;

QSet

基于散列表的集合模板类,存储数据的顺序是不定的,查找值的速度非常快,内部是QHash实现的。

QSet<QString> set;
set.insert("one");
set.insert("three");
set.insert("seven");

set << "twelve" << "fifteen" << "nineteen";

迭代器

  • 只读迭代器:QSet::const_iterator;
  • 读写迭代器:QSet::iterator;

QHash与QMap的区别

  1. QHash比QMap的查找速度快;
  2. 在QMap上遍历时,数据项是按照键排序的,而QHash的数据项是任意顺序的;
  3. QMap的键必须提供"<“运算符,QHash的键必须提供”=="运算符和一个名称为qHash()的全局散列函数;

begin() cbegin() constBegin() keyBegin()的区别

begin()

  • 返回一个指向容器中第一个元素的迭代器;
  • 如果容器为空,则返回的迭代器等于 end();
  • 通常用于在容器中迭代;

cbegin()

  • 返回一个常量迭代器,指向容器中的第一个元素;
  • 这个迭代器不能被修改,只能用于读取;
  • 与 begin() 的主要区别在于 cbegin() 返回的是常量迭代器;

constBegin()

  • 类似于 cbegin(),也返回一个指向容器中第一个元素的常量迭代器;
  • 主要用于在类中提供常量迭代器,而不需要外部调用者修改容器;

keyBegin()

  • 当涉及到像 QMap 这样的关联容器时,keyBegin() 返回一个指向容器中第一个键的迭代器;
  • 它通常用于遍历映射中的键;

总结:这些函数都是为了方便地在 Qt 的容器类中进行迭代。选择哪个函数取决于你的需求:如果你需要修改迭代器指向的元素,
使用 begin() 或 constBegin();如果你只需要读取数据,并且需要确保不修改,那么可以使用 cbegin() 或 constBegin();
而当你需要遍历映射中的键时,使用 keyBegin()文章来源地址https://www.toymoban.com/news/detail-837076.html

到了这里,关于【嵌入式——QT】容器类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【嵌入式Qt开发入门】如何使用Qt进行文本读写——QFile读写文本

            在很多时候我们需要读写文本文件进行读写,比如写个 Mp3 音乐播放器需要读 Mp3 歌词里的文本,比如修改了一个 txt 文件后保存,就需要对这个文件进行读写操作。本文介绍简单的文本文件读写,内容精简,让大家了解文本读写的基本操作。         QFile 类提

    2024年02月12日
    浏览(45)
  • 【嵌入式Qt开发入门】如何使用Qt进行绘制实时图表——QChart 图表

            要想使用 Qt Charts,我们的 Qt 版本得使用 Qt 5.7 之后的版本。其实 Qt Charts 并不是 Qt 5.7 才有的,是在 Qt 5.7 以前只有商业版本的 Qt 才有 Qt Charts。我们能免费下载的 Qt 版本都是社区(开源)版本。         Qt Charts 很方便的绘制我们常见的曲线图、折线图、柱状

    2024年02月12日
    浏览(65)
  • 【嵌入式Qt开发入门】Qt如何网络编程——获取本机的网络信息

            Qt 网络模块为我们提供了编写TCP/IP客户端和服务器的类。它提供了较低级别的类,例如代表低级网络概念的 QTcpSocket,QTcpServer 和 QUdpSocket,以及诸如 QNetworkRequest, QNetworkReply 和 QNetworkAccessManager 之类的高级类来执行使用通用协议的网络操作。它 还提供了诸如QNet

    2024年02月16日
    浏览(57)
  • Qt/C++编写物联网管理平台(支持win/linux/mac/嵌入式linux/modbus等)

    这个物联网综合管理平台前后迭代了五年,一点一滴慢慢积累起来,从最开始的只有modbus串口协议解析以及简单的表格显示数据,慢慢的逐渐增加了tcp_rtu支持,用户管理模块,地图监控模块,而后为了拓展性又做了云端数据同步,网络数据转发等。编写这个系统的过程中,真

    2024年02月10日
    浏览(183)
  • 【嵌入式Qt开发入门】在Ubuntu下编写C++

            在 Ubuntu 上面编写 C++,本文内容主要介绍在 Ubuntu 在终端窗口下使用 vi/vim 编辑一 个 C++源文件。通过编写最简单的示例“Hello,World!”。带领大家学习如何在 Ubuntu 终端下编辑和编译 C++。这里要求大家会在 Ubuntu 上使用 vi/vim,也就是要求大家有一点 Ubuntu 入门的基

    2024年02月11日
    浏览(45)
  • 嵌入式Linux Qt5 (C++)开发栏目概述

    本栏目开始介绍Linux系统下的Qt C++程序开发,资源是以嵌入式为切入点(现在Linux系统下的Qt C++程序开发好像就是应用于嵌入式),那就跟着一起学习 Linux系统下的Qt C++程序开发知识 ,再扩展一下 嵌入式 的知识吧。我这里默认已经 熟悉C++基本语法、熟悉Qt在windows下的使用方

    2024年02月12日
    浏览(46)
  • 音视频开发:Qt在视频剪辑3D桌面软件获胜, 嵌入式不敌安卓

    1 Qt Android嵌入式应用层开发方向对比   大家都知道啊,做嵌入式linux设备,一些没有屏幕,比如安防摄像头,门铃之类的,另外一些嵌入式设备是有触控屏,在触控屏上还跑应用软件的,这种比如商场各种自动售卖机,铁路卖票,银行自助服务,车载系统等。 10年前,我大学

    2024年02月09日
    浏览(46)
  • 嵌入式QT (Qt 信号与槽)

    因为有了信号与槽的编程机制,在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单。 信号 (Signal)就是在特定情况下被发射的事件。 GUI 程序设计的主要内容就是对界面上各组件的信号的响应,只需要知道什么情况下发射哪些信号,合理地去响应和处理这些信号就

    2024年02月02日
    浏览(51)
  • 嵌入式QT- QT使用MQTT

    目录 一、MQTT介绍 二、MQTT概念   2.1 订阅(Subscribtion)   2.2 会话(Session)   2.3 主题名(Topic Name)    2.4 主题筛选器(Topic Filter)    2.5 消息订阅 三、MQTT中的角色 3.1 客户端 3.2 服务器 四、X86平台安装mosquitto 4.1 下载 mosquitto 服务器 4.2 下载 mosquitto 客户端 4.3 mosquitto 命令

    2024年02月13日
    浏览(49)
  • 嵌入式Qt 第一个Qt项目

    打开Qt Creator 界面选择 New Project或者选择菜单栏 【文件】-【新建文件或项目】菜单项   弹出New Project对话框,选择Qt Widgets Application 选择【Choose】按钮,弹出如下对话框 设置项目名称和路径,按照向导进行下一步   选择编译套件 向导会默认添加一个继承自QMainWindow的类,可

    2024年02月20日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包