本页内容

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

公共类型

公共函数

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(T &&value)
(since 6.12) QSet<T>::iterator insert(QSet<T>::const_iterator it, 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(QSet<T> &&other)
QSet<T> &unite(const QSet<T> &other)
QList<T> values() const &
(since 6.12) QList<T> values() &&
QSet<T> &operator&=(const QSet<T> &other)
QSet<T> &operator&=(const T &value)
QSet<T> &operator+=(QSet<T> &&other)
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|=(QSet<T> &&other)
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, QSet<T> &&rhs)
QSet<T> operator+(QSet<T> &&lhs, const QSet<T> &rhs)
QSet<T> operator+(const QSet<T> &lhs, 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, QSet<T> &&rhs)
QSet<T> operator|(QSet<T> &&lhs, const QSet<T> &rhs)
QSet<T> operator|(const QSet<T> &lhs, QSet<T> &&rhs)
QSet<T> operator|(const QSet<T> &lhs, const QSet<T> &rhs)

详细说明

QSet<T> 是 Qt 的泛型容器类之一,其中T 指定了集合中存储的值的类型。它以未指定的顺序存储值,并提供非常快速的值查找功能。在内部,QSet<T> 实现为QHash 。

以下是一个包含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 风格的迭代器(QSetIterator 和QMutableSetIterator )以及STL 风格的迭代器(QSet::iterator 和QSet::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 、QHash 以及QMap 。

成员类型文档

QSet::ConstIterator

QSet::const_iterator 的 Qt 风格同义词。

QSet::Iterator

QSet::iterator 的 Qt 风格同义词。

QSet::const_pointer

const T * 的 typedef。为兼容 STL 而提供。

QSet::const_reference

const T & 的 typedef。为兼容 STL 而提供。

QSet::difference_type

const ptrdiff_t 的 typedef。为兼容 STL 而提供。

QSet::key_type

T 的 typedef。为兼容 STL 而提供。

QSet::pointer

T * 的 typedef。为兼容 STL 而提供。

QSet::reference

T 的 typedef。为兼容 STL 而提供。

QSet::size_type

int 的 typedef。为兼容 STL 而提供。

QSet::value_type

T 的 typedef 定义。为确保与 STL 兼容而提供。

成员函数文档

[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

返回一个位于集合中第一个元素处的常量STL 风格迭代器。

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

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

返回一个位于集合中第一个元素处的非 constSTL 风格迭代器。

这是一个重载函数。

qsizetype QSet::capacity() const

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

此函数的唯一目的是提供一种精细调整QSet 内存使用情况的手段。通常情况下,您几乎不需要调用此函数。若要了解集合中包含多少个元素,请调用size()。

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

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

返回一个位于集合中第一个元素处的常量STL 风格迭代器。

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

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

返回一个指向集合中最后一个元素之后的虚拟元素的、STL 风格的const迭代器。

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

void QSet::clear()

从集合中移除所有元素。

另请参阅 ` remove()`。

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

返回一个位于集合中第一个元素处的常量STL 风格迭代器。

另请参阅 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 风格的const迭代器。

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

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

返回一个非 const 的STL 风格迭代器,该迭代器指向集合中最后一个元素之后的虚拟元素。

这是一个重载函数。

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 处的 const 迭代器。如果集合中不包含元素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(T &&value)

这是一个重载函数。

该函数在 Qt 6.1 中引入。

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

这是一个重载函数。

该函数在 Qt 6.12 中引入。

[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(QSet<T> &&other)

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

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

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

QList<T> QSet::values() const &

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

注意:自 Qt 5.14起 ,Qt 的泛型容器类已支持范围构造函数,应使用该方法代替此方法。

此函数以线性时间复杂度创建一个新列表。通过从 `constBegin()` 迭代到 `constEnd()`,可以避免由此产生的时间和内存消耗。

[since 6.12] QList<T> QSet::values() &&

这是一个重载函数。

该函数在 Qt 6.12 中引入。

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+=(QSet<T> &&other)

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

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

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

与 unite(other)。

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

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> &QSet::operator<<(const T &value)

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

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

向集合中插入新元素value ,并返回该集合的引用。如果集合中已存在value ,则该集合保持不变。

另请参阅 insert()。

相关非成员

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

从集合set 中移除所有满足谓词pred 为真 的元素。返回被移除的元素个数(如有)。

该函数在 Qt 6.1 中引入。

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

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

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

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

另请参阅 operator==()。

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

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

返回一个新的QSet ,该 是集合lhs 和rhs 的交集。

另请参阅 intersect()、operator&=()、operator|() 以及operator-()。

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

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

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

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

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

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

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

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

返回一个新的QSet ,该集合是集合lhs 和rhs 的并集。

另请参阅 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 ,该对象表示集合lhs 与rhs 的并集。

另请参阅 subtract()、operator-=()、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 运算符的格式。

© 2026 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.