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 属于隐式共享类。
该类可等价比较。
注意:该类中的所有函数都是可重入的。
公共类型
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(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 风格的迭代器(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-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().
相同 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() 。
[noexcept]
QSet<T>::const_iterator QSet::cbegin() const
返回位于集合第一项的 ConstSTL 样式迭代器。
[noexcept]
QSet<T>::const_iterator QSet::cend() const
返回一个常STL 样式的迭代器,指向集合中最后一项之后的虚项。
void QSet::clear()
删除集合中的所有元素。
另请参见 remove().
[noexcept]
QSet<T>::const_iterator QSet::constBegin() const
返回位于集合第一项的 ConstSTL 样式迭代器。
[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 样式的迭代器,其位置在集合中最后一项之后的虚项上。
QSet<T>::iterator QSet::end()
这是一个重载函数。
返回一个非constSTL 风格的迭代器,指向集合中最后一项之后的虚项。
QSet<T>::iterator QSet::erase(QSet<T>::const_iterator pos)
从集合中删除位于迭代器位置pos 的项目,并返回一个位于集合中下一个项目的迭代器。
与remove() 不同的是,该函数不会导致QSet 重述其内部数据结构。这意味着可以在迭代时安全地调用该函数,并且不会影响集合中项的顺序。
QSet<T>::const_iterator QSet::find(const T &value) const
返回一个位于集合中项目value 处的常量迭代器。如果集合中不包含项目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(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
。
[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 交换这组数据。这一操作非常快速,从未出现过故障。
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 ,它是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 集合的交集。
另请参阅 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 ,它是lhs 和rhs 的集合差。
另请参阅 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.