【Qt】之QSet使用

描述

QSet类是一个模板类,它提供基于散列表的集合。

QSet是Qt的通用容器类之一。它以未指定的顺序存储值,并提供非常快速的值查找。在内部,QSet是作为QHash实现的。

下面是一个带有QString值的QSet示例:

QSet<QString> set;

插入方式1:

  set.insert("one");set.insert("three");set.insert("seven");

插入方式2:

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

判断是否包含:

  if (!set.contains("ninety-nine"))...

如果要浏览存储在QSet中的所有值,可以使用迭代器。QSet支持java风格的迭代器(QSetIterator和QMutableSetIterator)和stl风格的迭代器(QSet::iterator和QSet::const_iterator)。
下面是QSet使用java风格的迭代器:

  QSetIterator<QWidget *> i(set);while (i.hasNext())qDebug() << i.next();

下面是使用STL-style风格迭代器:

  QSet<QWidget *>::const_iterator i = set.constBegin();while (i != set.constEnd()) {qDebug() << *i;++i;}

QSet是无序的,因此不能假定迭代器的序列是可预测的。如果需要按键排序,请使用QMap。

要在QSet中导航,还可以使用foreach:

  QSet<QString> set;...foreach (const QString &value, set)qDebug() << value;

可以使用remove()从集合中删除项。还有一个clear()函数可以删除所有项。

QSet的值数据类型必须是可赋值的数据类型。例如,不能将QWidget存储为值;相反,存储一个QWidget *。此外,该类型必须提供operator==(),并且还必须有一个全局qHash()函数,该函数返回键类型参数的散列值。有关QHash()支持的类型列表,可以参考QHash文档。

在内部,QSet使用散列表来执行查找。哈希表自动增长和收缩,以提供快速查找而不浪费内存。如果已经大致知道QSet将包含多少元素,仍然可以通过调用reserve()来控制哈希表的大小,但这不是获得良好性能所必需的。还可以调用capacity()来检索哈希表的大小。

示例

#include <QDebug>
#include <QSet>
#include <QSetIterator>int main(int argc, char *argv[])
{QApplication a(argc, argv);QSet<QString> set;// 重置大小set.reserve(10);// 输出容量qDebug().noquote() << "容量 :" << set.capacity();// 插入数据set.insert("1");set.insert("12");set.insert("21");set.insert("212");set.insert("121");// 输出实际大小qDebug().noquote() << "实际大小:" << set.size();// 输出内容qDebug().noquote() << "输出内容 :" << set;// 遍历/// 1. java styleQSetIterator<QString> it_java(set);while (it_java.hasNext()) {qDebug().noquote() << "java_style : " << it_java.next();}/// 2. stl styleQSet<QString>::const_iterator it_stl = set.cbegin();while (it_stl != set.cend()) {qDebug().noquote() << "stl_style : " << *it_stl;++it_stl;}// 是否包含if(set.contains("121"))qDebug().noquote() << "" << "存在";elseqDebug().noquote() << "" << "不存在";// 是否是空qDebug().noquote() << "是否为空 :" << set.isEmpty();// 移除某值set.remove("121");// 输出成QListQList<QString> listStrs = set.toList();qDebug().noquote() << "输出成QList :" << listStrs;// 输出所有元素qDebug().noquote() << "输出元素 :" << set.values();// 清除set.clear();// 是否为空qDebug().noquote() << "是否为空 :" << set.isEmpty();return a.exec();
}

结果

在这里插入图片描述

使用场景

  1. 消除重复项:如果有一个包含重复项的列表或数组,并且想要消除重复项,可以使用QSet。QSet会自动删除重复的元素,只保留唯一的元素。
  2. 快速查找:QSet提供了高效的插入、查找和删除操作。如果需要频繁地查找元素是否存在于一个集合中,QSet是一个很好的选择。它的查找操作的时间复杂度接近于O(1),因此非常快速。
  3. 集合运算:QSet支持常见的集合运算,如并集、交集和差集。可以使用QSet来执行这些操作,对两个集合进行合并、比较或找出它们的共同元素。
  4. 存储唯一标识符:在某些情况下,可能需要存储一组唯一标识符,例如数据库中的唯一ID或网络中的唯一连接。QSet可以方便地存储这些标识符,并确保每个标识符只出现一次。
  5. 跟踪状态:如果需要跟踪一组对象的状态,并确保每个状态只出现一次,可以使用QSet。例如,在一个游戏中,可能需要跟踪玩家已经访问过的关卡,以确保他们不会重复访问。

结论

平平无奇

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

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

相关文章

【一文讲清楚 Anaconda 相关环境配置与Package管理】

文章目录 0 前言1 Package 与环境1.1 module1.2 package1.3 环境 2 Conda、Miniconda、Anaconda和Pip & PyPI2.1 Conda2. 2 Miniconda2.3 Anaconda2.3.1 Anaconda Navigator2.3.2 Anaconda PowerShell Prompt & Anaconda Prompt2.3.3 Jupyter notebook 2.4 Pip & P…

纵观手机市场,手机即鏖战全面屏

9月13日&#xff0c;在相继发布Apple TV、Apple Watch 和iPhone 8/8 Plus之后&#xff0c;当大家都以为苹果新品发布会临近结束之时&#xff0c;苹果前CEO史蒂夫乔布斯的这句经典名言再现屏幕&#xff0c;iPhone X终于揭开了神秘面纱。 “One more thing”。 9月13日&#xff…

Codeforces Round #911 (Div. 2)

A.Cover in Water 题意&#xff1a; 有一个 1 n 1 \times n 1n的水池&#xff0c;里面有些格子可以加水&#xff0c;有些格子是被堵上的&#xff0c;你可以进行以下两种操作&#xff1a; 1.往一个空的格子里加水 2.移除一个有水的格子中的水&#xff0c;并将这些水添加到另…

2024年最受欢迎的项目管理工具盘点

十大项目管理系统包括&#xff1a;1.产品研发项目管理工具&#xff1a;PingCode&#xff1b;2.通用项目协作工具&#xff1a;Worktile&#xff1b;3.开源项目管理系统&#xff1a;Redmine&#xff1b;4.IT/敏捷项目管理系统&#xff1a;Jira&#xff1b;5.免费个人项目管理&…

dbvisual editor 显示中文乱码

打开如下的页面就可以选择中文相关的字体就可以正常显示中文了。

Leetcode—83.删除排序链表中的重复元素【简单】

2023每日刷题&#xff08;四十&#xff09; Leetcode—83.删除排序链表中的重复元素 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* deleteDuplicates(struct ListNode* head) {i…

国自然项目基金撰写及技巧

随着社会经济发展和科技进步&#xff0c;基金项目对创新性的要求越来越高。申请人需要提出独特且有前瞻性的研究问题&#xff0c;具备突破性的科学思路和方法。因此&#xff0c;基金项目申请往往需要进行跨学科的技术融合。申请人需要与不同领域结合&#xff0c;形成多学科交叉…

【鲁班猫创意大赛2期】基于鲁班猫的幼儿Al监督系统

【鲁班猫创意大赛2期】基于鲁班猫的幼儿Al监督系统 作品介绍 本作品名称为“基于鲁班猫的幼儿 Al 学习助手”&#xff08;系统总体框图如下图&#xff09;&#xff0c;作品应用群体为幼儿群体&#xff0c;主要功能&#xff1a;通过实时坐姿检测&#xff0c;防止坐姿不端正导致…

C语言错误处理之 “信号处理方式<signal.h>及signal函数等内置函数”

目录 前言 signal.h头文件 信号宏 signal函数 实例&#xff1a;在Linux环境下验证signal函数 实例&#xff1a;在Linux中演示保存signal函数的返回值 预定义的信号处理函数&#xff08;简单了解&#xff09; SIG_DFL函数 SIG_IGN函数 raise函数 实例&#xff1a;测试…

C语言数据结构-----栈和队列练习题(分析+代码)

前言 前面的博客写了如何实现栈和队列&#xff0c;下来我们来看一下队列和栈的相关习题。 链接: 栈和队列的实现 文章目录 前言1.用栈实现括号匹配2.用队列实现栈3.用栈实现队列4.设计循环队列 1.用栈实现括号匹配 此题最重要的就是数量匹配和顺序匹配。 用栈可以完美的做到…

深度学习:全面了解深度学习-从理论到实践

深度学习&#xff1a;全面了解深度学习-从理论到实践 摘要&#xff1a;本文旨在为读者提供一份全面的深度学习指南&#xff0c;从基本概念到实际应用&#xff0c;从理论数学到实践技术&#xff0c;带领读者逐步深入了解这一领域。我们将一起探讨深度学习的历史、发展现状&#…

【挑战业余一周拿证】二、在云中计算 - 第 1 节 - 模块2 简介

第 1 节 - 模块2 简介 无论你的企业是属于像医疗、保健、制造、保险等等行业 , 再或者 , 您的服务是向全世界的数百万用户提供视频、、图片或者文字服务,你也需要服务器来为您的业务和应用程序提供支持,服务器的作用是帮助您托管应用程序并提供满足您业务需求的计算能力. 当你使…