Qt扫盲-QSet理论总结

QSet是Qt的一个通用容器,用于存储唯一值,内部实现为QHash。它可以快速查找值,支持插入、删除、遍历元素以及集合的交集、并集和差集运算。QSet的值类型需可赋值且支持比较和散列操作。可以与QList互转,但保持无序状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

QSet是Qt的通用容器类之一。俗称一个集合。QSet会按未指定的顺序存储值,也就是随机存值的方式,并提供非常快速的值查找。在内部,QSet实现为QHash。
在集合内部。值是唯一的哈。就行下面这个例子,把QStringList转成 Set 的方式就可以去除重复的元素。

  QStringList list;
  list << "Julia" << "Mike" << "Mike" << "Julia" << "Julia";

  QSet<QString> set = QSet<QString>::fromList(list);
  set.contains("Julia");  // returns true
  set.contains("Mike");   // returns true
  set.size();             // returns 2

二、使用

1. 声明

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

QSet<QString> set;

2. 插入元素

要向集合中插入一个值,可以使用insert():

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

另一种向集合中插入元素的方法是使用<<()运算符:

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

要测试一个元素是否属于集合,可以使用contains():

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

3. 遍历元素

如果想遍历存储在QSet中的所有值,可以使用迭代器。QSet支持java风格的迭代器(QSetIterator和QMutableSetIterator)和stl风格的迭代器(QSet::iterator和QSet::const_iterator)。

下面是如何使用java风格的迭代器迭代QSet<QWidget *>:

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

下面是相同的代码,但使用了stl风格的迭代器:

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;

4. 删除元素

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

5. 集合的运算

我们知道数学上的集合有很多运算

在这里插入图片描述
QSet 也提供了这些功能

  • QSet & intersect(const QSet &other):返回两个集合的交集
  • QSet & unite(const QSet &other):返回两个集合的并集
  • QSet & subtract(const QSet &other) :返回两个集合的差集

6. 其他

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

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

QSet 可以和QList相互转换

  • QList toList() :把QSet转成QList,但是是无序的。
  • fromList(const QList &list):把QList转为QSet,也是无序的而且是去重复的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太阳风暴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值