QSet Class
template <typename T> class QSetQSet 类是一个模板类,它提供了一个基于哈希表的集合。更多内容...
| 头文件: | #include <QSet> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
- 所有成员的列表,包括继承的成员
- QSet 属于“隐式共享类”和“容器类”。
注意:该类中的所有函数均为可重入的。
QSet 比较
| 类别 | 可比较类型 |
|---|---|
| 相等性 | QSet |
公共类型
| class | const_iterator |
| class | iterator |
| ConstIterator | |
| Iterator | |
| const_pointer | |
| const_reference | |
| difference_type | |
| key_type | |
| pointer | |
| reference | |
| size_type | |
| value_type |
公共函数
| 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 循环:
可以使用 `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()。
[noexcept] QSet<T>::const_iterator QSet::cbegin() const
返回一个位于集合中第一个元素处的常量STL 风格迭代器。
[noexcept] QSet<T>::const_iterator QSet::cend() const
返回一个指向集合中最后一个元素之后的虚拟元素的、STL 风格的const迭代器。
void QSet::clear()
从集合中移除所有元素。
另请参阅 ` remove()`。
[noexcept] QSet<T>::const_iterator QSet::constBegin() const
返回一个位于集合中第一个元素处的常量STL 风格迭代器。
[noexcept] QSet<T>::const_iterator QSet::constEnd() const
返回一个指向集合中最后一个元素之后的虚拟元素的常量STL 风格迭代器。
另请参阅 constBegin() 和end()。
QSet<T>::const_iterator QSet::constFind(const T &value) const
返回一个定位在集合中value 处的常量迭代器。如果集合中不包含value ,则该函数返回constEnd()。
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迭代器。
QSet<T>::iterator QSet::end()
返回一个非 const 的STL 风格迭代器,该迭代器指向集合中最后一个元素之后的虚拟元素。
这是一个重载函数。
QSet<T>::iterator QSet::erase(QSet<T>::const_iterator pos)
将迭代器位于位置pos 的元素从集合中移除,并返回一个指向集合中下一个元素的迭代器。
与remove() 不同,此函数绝不会导致QSet 重新哈希其内部数据结构。这意味着在迭代过程中可以安全地调用该函数,且不会影响集合中元素的顺序。
QSet<T>::const_iterator QSet::find(const T &value) const
返回一个定位在集合中元素value 处的 const 迭代器。如果集合中不包含元素value ,则该函数返回constEnd()。
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 。
bool QSet::isEmpty() const
如果集合中没有元素,则返回true ;否则返回false。
另请参见 size()。
bool QSet::remove(const T &value)
从集合中移除所有出现过的value 项。如果项确实被移除,则返回true;否则返回false 。
[since 6.1] template <typename Pred> qsizetype QSet::removeIf(Pred pred)
从该集合中移除所有满足谓词pred 返回true 的元素。若移除了元素,则返回移除的元素个数。
该函数在 Qt 6.1 中引入。
void QSet::reserve(qsizetype size)
确保集合的内部哈希表至少包含size 个桶。
此函数适用于需要构建大型集合且希望避免重复内存重新分配的代码。例如:
理想情况下,size 的值应略大于集合中预期的最大元素数。size 不必是质数,因为QSet 内部本就会使用一个质数。如果size 估计过低,最坏的情况无非是QSet 的运行速度会稍慢一些。
通常情况下,您几乎不需要调用此函数。QSet 的内部哈希表会自动缩小或扩大,以在不浪费过多内存的情况下提供良好的性能。
qsizetype QSet::size() const
返回集合中的元素个数。
void QSet::squeeze()
缩小集合内部哈希表的大小以节省内存。
此函数的唯一目的是提供一种方法来微调QSet 的内存使用情况。通常情况下,您几乎不需要调用此函数。
QSet<T> &QSet::subtract(const QSet<T> &other)
从该集合中移除所有属于other 集合的项目。返回对该集合的引用。
另请参阅 operator-=()、unite() 和intersect()。
[noexcept] void QSet::swap(QSet<T> &other)
将此集合与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)
另请参阅 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)
另请参阅 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.