【Qt-容器类】

Qt编程指南

  • ■ 顺序容器类
    • ■ QList
    • ■ QVector
    • ■ QLinkedList
    • ■ QStack
    • ■ QQueue
  • ■ 关联容器类
    • ■ QSet
    • ■ QMap
    • ■ QMultiMap
    • ■ QHash
    • ■ QMultiHash

■ 顺序容器类

■ QList

QList 比较常用的容器类,以数组列表的形式实现,在前、后添加数据非常快。以下为常用方法。
QList<QString> list;插入:insert()          //list.insert(2, "mm");         // 在位置2插入项目     list << "aa" << "bb" << "cc"; // 插入项目
删除:removeAt(i)  //i 是下标
删除第3个  QString str =  list.takeAt(2); // 从列表中删除第3个项目,并获取它
替换:replace()       //替换第3个元素     list.replace(2, "bc");   
交换:   swap()          // list.swap(1,3);     // 交换项目1和项目3
移动:move()
添加:append()       // list.append("dd");            // 在列表尾部添加
头部添加: prepend("mm")          list.prepend("mm");           // 在列表头部添加
包含:  list.contains("mm");      //列表中是否包含“mm”
列表包含某值个数:  list.count("mm");  包含“mm”的个数 
查找 : list.indexOf("mm");     // 第一个“mm”的位置,默认从位置0开始往前查找 ,返回第一个匹配的项目的位置
往前查找: list.indexOf("mm", 2); // 第二个“mm”的位置,我们指定从位置1开始往前查找QList<QString> list;
list << "A" << "B" << "C" << "B" << "A";
list.indexOf("B"); // returns 1
list.indexOf("B", 1); // returns 1
list.indexOf("B", 2); // returns 3
list.indexOf("X"); // returns -1
bool QList::empty()  const表为空,则返回true 
list.begin(), list.end()
for(int i=0; i<list.size(); ++i)
{qDebug() << list.at(i);   
}QList<int> z;
z <<1<<2<<3<<4;          // z对应的值z[0] = 1;z[1] = 2;z[2] = 3;z[3] = 4;QList<int> z;
z <<1<<2<<3<<4;
z.removeAt(1);           //删除下标为1后,z对应的值z[0] = 1;z[1] = 3;z[2] = 4;#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();
}

■ QVector

append函数或者<<操作符来在数组最后端添加元素而不用担心溢出问题。
定义 QVector <int>  array(10) ;                 array[5]=4;
加元素 strArray.append("Hello"); //可以这样       
加元素 strArray<<"World!"; //也可以这样   
插入:    strArray.insert(1,"这就是在hello和world之间添加");
删除:    strArray.remove(1); //删除第一个元素,从0开始    strArray.remove(1,3); //从1开始,删除3个元素
复制(取代):    strArray.replace(1,"LEO"); //删除第一个元素,从0开始
是否含有contains()函数是用来查找向量容器内是否含有某个对象。
count()函数可以找出某个对象出现的次数。
resize()函数可以在任何时候改变QVector向量容器的体积
capacity()函数会告诉你向量容器所占内存的实际大小空间。
判断是否包含某元素  qDebug()<< Array.contains(12);末端添加元素:
QVector<int> Array;
Array<<3;   //第一种方式
Array.append(5);  //第二种方式种方式
QVector<int>::iterator num;
for (num=Array.begin(); num!=Array.end(); num++)
{qDebug()<< *num;
}//第二种方式
for (int i=0; i<Array.count(); i++)
{qDebug()<< Array[i];
}QVector<QString> strArray; 

■ QLinkedList

是链式列表,数据项不是连续的内存存储,基于迭代器访问数据项,插入和删除数据项操作时间相同
QLinkedList<QString> list;
list<<"1"<<"2"<<"3"<<"4";
// foreach正序:
QString str;
foreach (str, list)qDebug() << str;// 迭代器正序
QLinkedList<QString>::iterator it;
for(it = list.begin(); it != list.end(); ++it){qDebug() << *it;
}// 迭代器倒序
QLinkedList<QString>::const_iterator it = list.constEnd();
while (it != list.constBegin())
{--it;qDebug()<<*it;
}
移除某个节点
list.removeOne("4");列表大小
list.size()
链头位置插入
list.push_front("5");链尾位置插入
list.push_back("5");
清空
list.clear();

■ QStack

类似于堆栈,后入先出的特点,push()pop()用于数据进出栈。
QStack <int> s;                        //定义一个int型栈
s. isEmpty();                           //返回栈是否为空
s.size();                                //返回当前栈中元素的个数  
s.push();                                //在栈顶上堆进一个元素
s.pop();                                 //删除掉栈顶上的元素,并返回这个元素
s.top();                                //返回栈顶的元素,并不会删除  
T &  operator[] ( int i );            //以数组形式访问队列元素QStack<int> stack;
stack.push(1);   
stack.push(2);
stack.push(3);while(!stack.isEmpty())stack.pop();

■ QQueue

它的父类是QList,是个模板类 
类似于队列,先入先出的特点,enqueue()dequeue()用于操作数据进出队列。
QQueue<int> Q;              //定义一个int型队列
Q.isEmpty();                 //返回队列是否为空
Q.size();                    //返回队列元素个数
Q.clear();                   //清空队列
Q.enqueue();                 //在队列尾部添加一个元素, 比如插入数字5: Q.enqueue(5)
Q.dequeue();                 //删除当前队列第一个元素,并返回这个元素
Q.head();                    //返回当前队列第一个元素
Q.last();                    //返回当前队列尾部的元素
T &  operator[]( int i );    //以数组形式访问队列元素QQueue<int> queue;
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);while(!queue.isEmpty())queue.dequeue();

■ 关联容器类

■ QSet

基于散列表的集合模板类,存储数据的顺序不定,查找速度非常快。
QSet类是一个模板类,他是一个哈希表集合。QSet<T>是Qt的一个普通容器类。QSet存储的值是不指明顺序的,QSet对这些值提供了快速检索的功能。他和QHash很像PS:Set就是键值一样的Hash
QSet<QString> set;
set.insert("one");
set.insert("three");
set << "twelve" << "fifteen" << "nineteen";使用contains()判断set中是否存在某一项:
if (!set.contains("ninety-nine"))遍历整个set
QSetIterator<QWidget *> i(set);
while (i.hasNext())
qDebug() << i.next();QSet<QWidget *>::const_iterator i = set.constBegin();while (i != set.constEnd()) {qDebug() << *i;++i;}QSet<QString> set;
foreach (const QString &value, set)
qDebug() << value;#include <QtCore/QCoreApplication>
#include <QSet>
#include <QDebug>class Data{ 
public: Data(const QString &strVal, const int &intVal){ StrVal = strVal;IntVal = intVal;} QString StrVal;int IntVal; friend QDebug operator << (QDebug os, Data data){os << "(" << data.StrVal << " ,"<< data.IntVal << ")"; return os;}
}; 
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QSet<Data*> dataSet;dataSet.insert(new Data("ABC", 0));dataSet.insert(new Data("DEF", 1));dataSet << new Data("AAA", 2);dataSet << new Data("CCC", 3);//Java styleQSetIterator<Data *> i(dataSet);while(i.hasNext())qDebug() << *(i.next());//STL styleQSet<Data*>::const_iterator stlI = dataSet.constBegin();while(stlI != dataSet.constEnd()){qDebug() << **stlI;delete *stlI;stlI++;} return a.exec();
}

■ QMap

QMap存储数据按照键的顺序来存储的,一个键映射一个值。QMap<int,int> map;
map[1] = 1;
map[2] = 2;
map[3] = 3;
//或者使用insert
QMap<int,int> map;
map.insert(1,1);
map.insert(2,2);
map.insert(3,3);int num = map[1]; //或者 int num2 = map.value[2];

■ QMultiMap

是QMap的子类,一个键可以对应多个值。
QMultiMap<int,int> map;
map.insert(1,1);
map.insert(1,2);
//map.size() == 2 

■ QHash

基于散列表来实现的,查找速度非常快。
和QMap比较
QHash查找速度更快
QMap是按键顺序排序的,QHash数据项任意排序创建,键值对的方式插入,数据类型随意,这里以键int,值QString示例。
QHash<int,QString> qhash;//方式一
qhash[1] = "1";
qhash[2] = "2";
qhash[3] = "3";//方式二
qhash.insert(4,4);
通常,QHash 每个键只允许有一个值。如果用已经存在的键调用 insert(),先前的值将被删除 
qhash.insert(4,"10);
最后键为4的值将变成“10”。取值;
//方式一   
QString str1=qhash.value(1);//str1="1";//方式二
QString str2=qhash[2];//str1="2";如果qhash里面没有该键值,则返回默认构造值;比如:QString str3=qhash.value(5);//str3="";检索某个值是否在里面
if(qhash.contains(9))
{return false;
}if(qhash.contains(1))
{return true;
}查找某个字并获取,一般推荐contains结合value重载函数来实现,QString str;
if(qhash.contains(1))
{str=qhash.value(1);      
}
else
{str=qhash.value(1,"wert");//如果哈希表中不存在指定键的元素,该函数使用第2个参数作为默认值
}QHash<int,QString>::const_iterator it = qhash.constBegin();
while (it != qhash.constEnd()) {cout << it.key() << ": " << it.value() << Qt::endl;++i;
}
当然不用const_iterator也可以,直接iterator;删除,下面两种都可以
qhash.erase(it);//这里的it是迭代器哦
qhash.remove(key);

■ QMultiHash

QMultiHash是QHash的子类,用于处理多值映射的类,与QMultiMap类似。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/580722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot操作world格式的文件与pdf格式的文件互转

文章目录 一、SpringBoot如何将pdf格式的文件流转换成world格式的文件流二、SpringBoot如何将world格式的文件转换成pdf格式的文件 一、SpringBoot如何将pdf格式的文件流转换成world格式的文件流 ​ 将 PDF 格式的文件流转换成 Word 格式的文件流是一个比较复杂的任务&#xf…

【Linux基础】9. 用户管理

文章目录 【 1. 用户基本管理 】1.1 useradd 添加用户1.2 passwd 更改用户密码1.3 su 切换用户1.4 userdel 删除用户 【 2. 用户的组 】2.1 more 查看系统所有组2.2 显示用户的组2.3 更改用户的组 【 3. 环境变量 】 【 1. 用户基本管理 】 1.1 useradd 添加用户 全称作用use…

【教程】使用ipagurd打包与混淆Cocos2d-x的Lua脚本

文章目录 摘要引言正文1. 准备工作2. 使用ipaguard处理Lua文件3. 运行ipagurd进行混淆代码加密具体步骤测试和配置阶段IPA 重签名操作步骤4. IPA重签名与发布 总结 摘要 本文将介绍如何使用ipagurd工具对Cocos2d-x中的Lua脚本进行打包与混淆&#xff0c;以及在iOS应用开发中的…

tekton 发布 kubernetes 应用

tekton 发布 kubernetes 应用 基于Kubernetes 服务部署 Tekton Pipeline 实例&#xff0c;部署完成后使用tekton来完成源码拉取、应用打包、镜像推送和应用部署。 本文实现一个 golang-helloworld 项目 CI/CD 的完整流程&#xff0c;具体包括以下步骤&#xff1a; 从 gitee…

css 超过一行/多行显示省略号... - 附示例

效果 1、超过一行 2、超过多行 - 以两行为例 二、示例代码 1、超过一行 margin: 20px; width: 50px; border: 1px solid red; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; 2、超过多行 - 以两行为例 margin: 20px; width: 50px; border: 1px solid r…

【日常聊聊】年度总结

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 博客创作的初衷&#xff1a; 学到的技能&#xff1a; Java知识的深度掌握&#xff1a; Spring框架的应用和实践&#xff1a; 前端技…

Unity so文件的问题

文章目录 问题在面板上无法显示子节点如何保存继承于so的类必须放置在单个脚本so类文件名和类名要一致 问题 最近自己在写一个行为树出现一些问题记录一下首先NodeTree肯定是so文件但是node可以是单纯的类&#xff0c;也可以是so。后来我发现只能是so 在面板上无法显示 第一…

linux 网络工具(二)

linux 网络工具 1. ip命令簇4.1 address4.2 link4.3 route4.4 rule 2. 其他常用命令2.1 ifup/ifdown2.2 配置主机名2.3 设置DNS服务器指向2.4 配置域名解析2.5 ss2.6 路由相关配置文件2.7 查看机器可用端口2.8 traceroute2.9 dhclient 1. ip命令簇 Linux的ip命令和ifconfig类似…

asp.net core webapi AutoMapper使用

1.AutoMapper介绍&#xff1a; AutoMapper是一个.NET库&#xff0c;用于简化对象之间的映射。它可以帮助开发人员在不同类型之间进行自动转换&#xff0c;从而减少重复的手动映射代码。 使用AutoMapper&#xff0c;开发人员可以定义映射规则&#xff0c;然后该库会自动执行对…

Mybatis-Plus基础之Mapper增删改

文章目录 一、普通增删改普通新增普通删除根据 entity 条件&#xff0c;删除记录根据 ID 批量删除根据 ID 删除根据 columnMap 条件&#xff0c;删除记录 普通修改根据 whereWrapper 条件&#xff0c;更新记录根据 ID 修改 二、insert ID 主键回填三、条件删除&#xff1a;使用…

【C语言学习疑难杂症】第12期:如何从汇编角度深入理解y = (*--p)++这行代码(易懂版)

对于如下代码,思考一下输出结果是什么? int a[] = {5, 8, 7, 6, 2, 7, 3}; int y, *p = &a[1]; y = (*--p)++; printf("%d ",y); printf("%d",a[0]); 这个代码看似简单,但是在“y = (*--p)++;”这行代码里,编译器做了很多工作。 我们在vs2022的…

系列十七(面试)、请你谈谈RocketMQ的消息丢失问题

一、RocketMQ的消息丢失问题 1.1、概述 生产环境中为了保证服务的高可用&#xff0c;一般情况下都是采用集群的方式&#xff0c;RocketMQ也不例外&#xff0c;另外现在企业级的开发基本都是分布式微服务的模式&#xff0c;这就存在着跨网络传输数据的问题&#xff0c;而网络传…

促进软件开发团队创新的方法和团队协作原则

在迅速发展的科技领域&#xff0c;创新成为软件开发团队不可或缺的一部分。为了在竞争激烈的市场中保持竞争力&#xff0c;团队需要采用创新的方法&#xff0c;并建立一种积极的团队协作文化。本文将探讨一些促进软件开发团队创新的方法和团队协作原则。 1. 鼓励创意和实验 为团…

qt中实现鼠标拖动一张图片到qt控件内,图片自动在控件中展示

很多电脑软件都有鼠标拖动一张图片或者拖动一个文件到软件的指定区域内&#xff0c;就可以自动在软件中显示图片内容或者文件内容。qt中也可以这样实现。 本文介绍两种方法&#xff1a; 1、只可以以非管理员的身份运行软件时&#xff0c;才可以实现上述功能。 mainwindow.h#…

orangepi--开发板配置网络SSH登录

常用指令&#xff1a; ifconfig-------------------------------------查看网络地址 sudo passwd orangepi-------------------------改密码 nmcli dev wifi-------------------------------查看wifi nmcli dev wifi connect xx password xx--------连接网络 ip addr show wla…

【PTA】L1-016 验证身份(C++)

题目链接 &#xff1a; 题目要求&#xff1a; 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下&#xff1a; 首先对前17位数字加权求和&#xff0c;权重分配为&#xff1a;{7&#xff0c;9&#xff0c;10&#xff0c;5&#xff0…

【七】【C语言\动态规划】最大子数组和、环形子数组的最大和、乘积最大子数组,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…

成交订单的条件是什么?搞清楚后再去开发客户

订单&#xff0c;也就是贵司某个产品满足了客户的需求&#xff0c;双方达成合作意向&#xff0c;说白也就是商品需求和供给的匹配。 那么&#xff0c;想要客户下订单&#xff0c;就要弄明白什么样的产品才能满足客户的需求匹配&#xff1f;了解客户关心的点在哪些方面&#xf…

python脚本抢各大平台大额优惠卷

文章目录 python脚本抢各大平台大额优惠卷写在前面准备阶段一、所需工具二、ChromeDriver下载教程 三、Seleuinm安装1、打开cmd&#xff0c;输入如下命令 开始抢券淘宝脚本京东抢购脚本 python脚本抢各大平台大额优惠卷 写在前面 当电商平台上演盛大的购物狂欢时&#xff0c;如…

SpringBoot3 基础特性

1. SpringApplication 1.1. 自定义 banner 类路径添加banner.txt或设置spring.banner.location就可以定制 banner推荐网站&#xff1a;Spring Boot banner 在线生成工具&#xff0c;制作下载英文 banner.txt&#xff0c;修改替换 banner.txt 文字实现自定义&#xff0c;个性化…