当前位置:首页 >> 智能终端演进 >> 【Qt】之QSet使用,oracom

【Qt】之QSet使用,oracom

cpugpu芯片开发光刻机 智能终端演进 1
文件名:【Qt】之QSet使用,oracom 【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();} 结果

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

平平无奇。

协助本站SEO优化一下,谢谢!
关键词不能为空
同类推荐
«    2025年12月    »
1234567
891011121314
15161718192021
22232425262728
293031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接