QSet Class

template <typename T> class QSet

QSet 类是一个模板类,提供基于哈希表的集合。更多

头文件: #include <QSet>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

该类可等价比较

注意:该类中的所有函数都是可重入的

公共类型

公共函数

QSet()
QSet(std::initializer_list<T> list)
QSet(InputIterator first, InputIterator last)
QSet<T>::const_iterator begin() const
QSet<T>::iterator begin()
qsizetype capacity() const
QSet<T>::const_iterator cbegin() const
QSet<T>::const_iterator cend() const
void clear()
QSet<T>::const_iterator constBegin() const
QSet<T>::const_iterator constEnd() const
QSet<T>::const_iterator constFind(const T &value) const
bool contains(const QSet<T> &other) const
bool contains(const T &value) const
qsizetype count() const
bool empty() const
QSet<T>::const_iterator end() const
QSet<T>::iterator end()
QSet<T>::iterator erase(QSet<T>::const_iterator pos)
QSet<T>::const_iterator find(const T &value) const
QSet<T>::iterator find(const T &value)
QSet<T>::iterator insert(const T &value)
(since 6.1) QSet<T>::iterator insert(QSet<T>::const_iterator it, const T &value)
QSet<T> &intersect(const QSet<T> &other)
bool intersects(const QSet<T> &other) const
bool isEmpty() const
bool remove(const T &value)
(since 6.1) qsizetype removeIf(Pred pred)
void reserve(qsizetype size)
qsizetype size() const
void squeeze()
QSet<T> &subtract(const QSet<T> &other)
void swap(QSet<T> &other)
QSet<T> &unite(const QSet<T> &other)
QList<T> values() const
QSet<T> &operator&=(const QSet<T> &other)
QSet<T> &operator&=(const T &value)
QSet<T> &operator+=(const QSet<T> &other)
QSet<T> &operator+=(const T &value)
QSet<T> &operator-=(const QSet<T> &other)
QSet<T> &operator-=(const T &value)
QSet<T> &operator<<(const T &value)
QSet<T> &operator|=(const QSet<T> &other)
QSet<T> &operator|=(const T &value)
(since 6.1) qsizetype erase_if(QSet<T> &set, Predicate pred)
bool operator!=(const QSet<T> &lhs, const QSet<T> &rhs)
QSet<T> operator&(QSet<T> &&lhs, const QSet<T> &rhs)
QSet<T> operator&(const QSet<T> &lhs, const QSet<T> &rhs)
QSet<T> operator+(QSet<T> &&lhs, const QSet<T> &rhs)
QSet<T> operator+(const QSet<T> &lhs, const QSet<T> &rhs)
QSet<T> operator-(QSet<T> &&lhs, const QSet<T> &rhs)
QSet<T> operator-(const QSet<T> &lhs, const QSet<T> &rhs)
QDataStream &operator<<(QDataStream &out, const QSet<T> &set)
bool operator==(const QSet<T> &lhs, const QSet<T> &rhs)
QDataStream &operator>>(QDataStream &in, QSet<T> &set)
QSet<T> operator|(QSet<T> &&lhs, const QSet<T> &rhs)
QSet<T> operator|(const QSet<T> &lhs, const QSet<T> &rhs)

详细说明

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

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

要在集合中插入一个值,请使用insert() :

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

向集合中插入项目的另一种方法是使用operator<<() :

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

要测试项目是否属于集合,请使用contains() :

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

如果要浏览存储在 QSet 中的所有值,可以使用迭代器。QSet 支持Java 风格的迭代器QSetIteratorQMutableSetIterator )和STL 风格的迭代器QSet::iteratorQSet::const_iterator )。下面是如何使用 Java 风格迭代器遍历 QSet<QWidget *>:

QSetIterator<QWidget*>i(set);while(i.hasNext()) { QWidget*w =i.next();    qDebug() << w;
}

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

for(autoi=set.cbegin(),end=set.cend(); i!=end;++i)    qDebug() << *i;

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

要浏览 QSet,也可以使用基于范围的 for:

QSet<QString>set;...for(const auto &value: set)    qDebug() << value;

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

QSet 的值数据类型必须是可分配的数据类型。例如,不能将QWidget 作为值存储;而应存储QWidget *。此外,该类型必须提供operator==() ,而且还必须有一个全局qHash() 函数,为键类型的参数返回一个哈希值。有关qHash() 支持的类型列表,请参见QHash 文档。

在内部,QSet 使用哈希表执行查找。哈希表会自动增大和缩小,以便在不浪费内存的情况下提供快速查找。如果您已经知道 QSet 大概包含多少个元素,还可以通过调用reserve() 来控制哈希表的大小,但这并不是获得良好性能的必要条件。您还可以调用capacity() 来获取散列表的大小。

另请参阅 QSetIterator,QMutableSetIterator,QHashQMap

成员类型文档

QSet::ConstIterator

QSet::const_iterator 的 Qt-style 同义词。

QSet::Iterator

QSet::iterator 的 Qt-style 同义词。

QSet::const_pointer

const T * 的类型定义。为与 STL 兼容而提供。

QSet::const_reference

const T & 的类型定义。为与 STL 兼容而提供。

QSet::difference_type

const ptrdiff_t 的类型定义。为与 STL 兼容而提供。

QSet::key_type

为 T 提供的类型定义,与 STL 兼容。

QSet::pointer

T * 的类型定义。为与 STL 兼容而提供。

QSet::reference

T & 的类型定义。为与 STL 兼容而提供。

QSet::size_type

int 的类型定义。为与 STL 兼容而提供。

QSet::value_type

为 T 提供的类型定义,用于兼容 STL。

成员函数文档

QSet<T> &QSet::operator+=(const T &value)

QSet<T> &QSet::operator<<(const T &value)

QSet<T> &QSet::operator|=(const T &value)

插入一个新项目value ,并返回对集合的引用。如果value 已存在于集合中,则集合保持不变。

另请参阅 insert().

QSet<T> &QSet::operator+=(const QSet<T> &other)

QSet<T> &QSet::operator|=(const QSet<T> &other)

相同 unite(other).

另请参见 operator|(),operator&=(), 和operator-=().

[noexcept] QSet::QSet()

构造空集。

另请参见 clear().

QSet::QSet(std::initializer_list<T> list)

构造一个集合,其中包含初始化列表list 中每个元素的副本。

template <typename InputIterator, QtPrivate::IfIsInputIterator<InputIterator> = true> QSet::QSet(InputIterator first, InputIterator last)

构造一个集合,其内容在迭代器范围 [first,last) 中。

InputIterator 的值类型必须可转换为T

注意: 如果范围 [first,last) 包含重复元素,则保留第一个元素。

[noexcept] QSet<T>::const_iterator QSet::begin() const

返回位于集合第一项的 ConstSTL 样式迭代器

另请参阅 constBegin() 和end()。

QSet<T>::iterator QSet::begin()

这是一个重载函数。

返回一个非 ConstSTL 样式的迭代器,位于集合中的第一个项目。

qsizetype QSet::capacity() const

返回集合内部哈希表中的桶数。

该函数的唯一目的是提供一种微调QSet 内存使用情况的方法。一般来说,您很少需要调用此函数。如果想知道集合中有多少项,请调用size() 。

另请参阅 reserve() 和squeeze()。

[noexcept] QSet<T>::const_iterator QSet::cbegin() const

返回位于集合第一项的 ConstSTL 样式迭代器

另请参阅 begin() 和cend()。

[noexcept] QSet<T>::const_iterator QSet::cend() const

返回一个常STL 样式的迭代器,指向集合中最后一项之后的虚项。

另请参阅 cbegin() 和end() 。

void QSet::clear()

删除集合中的所有元素。

另请参见 remove().

[noexcept] QSet<T>::const_iterator QSet::constBegin() const

返回位于集合第一项的 ConstSTL 样式迭代器

另请参阅 begin() 和constEnd()。

[noexcept] QSet<T>::const_iterator QSet::constEnd() const

返回一个常STL 样式的迭代器,指向集合中最后一项之后的虚项。

另请参阅 constBegin() 和end() 。

QSet<T>::const_iterator QSet::constFind(const T &value) const

返回一个位于集合中项目value 处的常量迭代器。如果集合中没有项目value ,函数返回constEnd()。

另请参阅 find() 和contains()。

bool QSet::contains(const QSet<T> &other) const

如果集合包含other 集合中的所有项目,则返回true ;否则返回false

另请参阅 insert()、remove() 和find()。

bool QSet::contains(const T &value) const

如果集合包含项目value ,则返回true ;否则返回 false。

另请参阅 insert()、remove() 和find()。

qsizetype QSet::count() const

size() 相同。

bool QSet::empty() const

如果集合为空,则返回true 。提供此函数是为了与 STL 兼容。它等同于isEmpty()。

[noexcept] QSet<T>::const_iterator QSet::end() const

返回一个常STL 样式的迭代器,其位置在集合中最后一项之后的虚项上。

另请参阅 constEnd() 和begin() 。

QSet<T>::iterator QSet::end()

这是一个重载函数。

返回一个非constSTL 风格的迭代器,指向集合中最后一项之后的虚项。

QSet<T>::iterator QSet::erase(QSet<T>::const_iterator pos)

从集合中删除位于迭代器位置pos 的项目,并返回一个位于集合中下一个项目的迭代器。

remove() 不同的是,该函数不会导致QSet 重述其内部数据结构。这意味着可以在迭代时安全地调用该函数,并且不会影响集合中项的顺序。

注意: 迭代器pos 必须有效且可取消引用。在任何其他迭代器(包括其自身的end() )上调用此方法都会导致未定义的行为。特别是,即使是空集的begin() 迭代器也不能被取消引用。

另请参阅 remove() 和find()。

QSet<T>::const_iterator QSet::find(const T &value) const

返回一个位于集合中项目value 处的常量迭代器。如果集合中不包含项目value ,函数返回constEnd()。

另请参阅 constFind() 和contains()。

QSet<T>::iterator QSet::find(const T &value)

这是一个重载函数。

返回一个位于集合中项目value 的非常数迭代器。如果集合中没有项目value ,函数返回end() 。

QSet<T>::iterator QSet::insert(const T &value)

如果value 尚未在集合中,则将项目value 插入集合,并返回指向插入项目的迭代器。

另请参阅 operator<<()、remove() 和contains()。

[since 6.1] QSet<T>::iterator QSet::insert(QSet<T>::const_iterator it, const T &value)

这是一个重载函数。

如果value 尚未在集合中,则将项目value 插入集合,并返回指向插入项目的迭代器。

迭代器it 将被忽略。

提供此函数是为了与 STL 兼容。

此函数在 Qt 6.1 中引入。

另请参阅 operator<<()、remove() 和contains()。

QSet<T> &QSet::intersect(const QSet<T> &other)

从该集合中删除不包含在other 集合中的所有项目。将返回对该集合的引用。

另请参阅 intersects()、operator&=()、unite() 和subtract()。

bool QSet::intersects(const QSet<T> &other) const

如果该集合与other 有至少一个共同项目,则返回true

另请参阅 contains() 和intersect() 。

bool QSet::isEmpty() const

如果集合不包含任何元素,则返回true ;否则返回 false。

另请参阅 size()。

bool QSet::remove(const T &value)

从集合中删除项目value 的任何出现。如果项目确实被移除,则返回 true;否则返回false

另请参阅 contains() 和insert()。

[since 6.1] template <typename Pred> qsizetype QSet::removeIf(Pred pred)

从该集合中删除谓词pred 返回true 的所有元素。如果有,返回移除元素的个数。

此函数在 Qt 6.1 中引入。

void QSet::reserve(qsizetype size)

确保集合的内部哈希表至少由size 个桶组成。

该函数适用于需要建立庞大数据集并希望避免重复重新分配的代码。例如

QSet<QString> set;
set.reserve(20000);
for (int i = 0; i < 20000; ++i)
    set.insert(values[i]);

理想情况下,size 应略大于集合中预期元素的最大数量。size 不一定是质数,因为QSet 内部会使用质数。如果size 是一个低估的值,那么最坏的结果就是QSet 会慢一些。

一般来说,你很少需要调用这个函数。QSet在不浪费太多内存的情况下,内部哈希表会自动缩小或增大,以提供良好的性能。

另请参阅 squeeze() 和capacity()。

qsizetype QSet::size() const

返回集合中的项目数。

另请参阅 isEmpty() 和count()。

void QSet::squeeze()

减小程序集内部哈希表的大小,以节省内存。

该函数的唯一目的是提供一种微调QSet 内存使用情况的方法。一般来说,您很少需要调用此函数。

另请参阅 reserve() 和capacity()。

QSet<T> &QSet::subtract(const QSet<T> &other)

从该集合中删除other 集合中包含的所有项目。返回对该集合的引用。

另请参阅 operator-=()、unite() 和intersect()。

[noexcept] void QSet::swap(QSet<T> &other)

other 交换这组数据。这一操作非常快速,从未出现过故障。

QSet<T> &QSet::unite(const QSet<T> &other)

other 集合中尚未包含的每个项目都会被插入到此集合中。将返回对该集合的引用。

另请参阅 operator|=()、intersect() 和subtract()。

QList<T> QSet::values() const

返回一个新的QList ,其中包含集合中的元素。QList 中元素的顺序未定义。

注: 自 Qt 5.14 起,Qt 的通用容器类提供了范围构造函数,应使用范围构造函数代替此方法。

此函数以线性时间创建一个新 list。可以通过从constBegin() 到constEnd() 的迭代来避免使用时间和内存。

QSet<T> &QSet::operator&=(const QSet<T> &other)

相同 intersect(other).

另请参阅 operator&(),operator|=() 和operator-=().

QSet<T> &QSet::operator&=(const T &value)

这是一个重载函数。

intersect(other)相同,如果我们将other视为包含单例value 的集合。

QSet<T> &QSet::operator-=(const QSet<T> &other)

相同 subtract(other).

另请参见 operator-(),operator|=(), 和operator&=().

QSet<T> &QSet::operator-=(const T &value)

从集合中删除项目value (如果找到),并返回集合的引用。如果value 不包含在集合中,则不会删除任何内容。

另请参阅 remove() 。

相关非成员

QSet<T> operator+(QSet<T> &&lhs, const QSet<T> &rhs)

QSet<T> operator+(const QSet<T> &lhs, const QSet<T> &rhs)

QSet<T> operator|(QSet<T> &&lhs, const QSet<T> &rhs)

QSet<T> operator|(const QSet<T> &lhs, const QSet<T> &rhs)

返回一个新的QSet ,它是lhsrhs 集合的联合。

另请参阅 unite(),operator|=(),operator&() 和operator-() 。

QSet<T> operator&(QSet<T> &&lhs, const QSet<T> &rhs)

QSet<T> operator&(const QSet<T> &lhs, const QSet<T> &rhs)

返回一个新的QSet ,它是lhsrhs 集合的交集。

另请参阅 intersect(),operator&=(),operator|() 和operator-() 。

QSet<T> operator-(QSet<T> &&lhs, const QSet<T> &rhs)

QSet<T> operator-(const QSet<T> &lhs, const QSet<T> &rhs)

返回一个新的QSet ,它是lhsrhs 的集合差。

另请参阅 subtract(),operator-=(),operator|() 和operator&() 。

[since 6.1] template <typename T, typename Predicate> qsizetype erase_if(QSet<T> &set, Predicate pred)

从集合set 中删除谓词pred 返回 true 的所有元素。如果有,则返回移除元素的个数。

此函数在 Qt 6.1 中引入。

[noexcept] bool operator!=(const QSet<T> &lhs, const QSet<T> &rhs)

如果lhs 集合不等于rhs 集合,则返回true ;否则返回false

如果两个集合包含相同的元素,则视为相等。

此函数要求值类型实现operator==()

另请参见 operator==()。

template <typename T> QDataStream &operator<<(QDataStream &out, const QSet<T> &set)

set 写入数据流out

该函数要求值类型实现operator<<()

另请参阅 QDataStream 操作符的格式

[noexcept] bool operator==(const QSet<T> &lhs, const QSet<T> &rhs)

如果lhs 集合等于rhs 集合,则返回true ;否则返回false

如果两个集合包含相同的元素,则视为相等。

此函数要求值类型实现operator==()

另请参见 operator!=()。

template <typename T> QDataStream &operator>>(QDataStream &in, QSet<T> &set)

从流in 中读取一个集合到set 中。

该函数要求值类型实现operator>>()

另请参阅 QDataStream 操作符的格式

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.