一、概述

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,也是无序的而且是去重复的。
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐