QSet理论总结
- 一、概述
- 二、使用
- 1. 声明
- 2. 插入元素
- 3. 遍历元素
- 4. 删除元素
- 5. 集合的运算
- 6. 其他
一、概述
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,也是无序的而且是去重复的。