QSet 类

模板 <typename T> class QSet

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

头文件 #include <QSet>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core

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

公共类型

公共函数

QSet()
QSet(std::initializer_list<T> list)
QSet(InputIterator first, InputIterator last)
QSet<T>::const_iteratorbegin() const
QSet<T>::iteratorbegin()
qsizetypecapacity() const
QSet<T>::const_iteratorcbegin() const
QSet<T>::const_iteratorcend() const
voidclear()
QSet<T>::const_iteratorconstBegin() const
QSet<T>::const_iteratorconstEnd() const
QSet<T>::const_iteratorconstFind(const T &value) const
boolcontains(const T &value) const
boolcontains(const QSet<T> &other) const
qsizetypecount() const
boolempty() const
QSet<T>::const_iteratorend() const
QSet<T>::iteratorend()
QSet<T>::iteratorerase(QSet<T>::const_iterator pos)
QSet<T>::const_iteratorfind(const T &value) const
QSet<T>::iteratorfind(const T &value)
QSet<T>::iteratorinsert(const T &value)
(since 6.1) QSet<T>::iteratorinsert(QSet<T>::const_iterator it, const T &value)
QSet<T> &intersect(const QSet<T> &other)
boolintersects(const QSet<T> &other) const
boolisEmpty() const
boolremove(const T &value)
(since 6.1) qsizetyperemoveIf(Pred pred)
voidreserve(qsize类型 size)
qsizetypesize() const
voidsqueeze()
QSet<T> &subtract(const QSet <i>other</i>)
voidswap(QSet <i>other</i>)
QSet<T> &unite(const QSet <i>other</i>)
QListvalues() const
booloperator!=(const QSet <i>other</i>) const
QSet<T> &operator&=(const QSet <i>other</i>)
QSet<T> &operator&=(const T <i>value</i>)
QSet<T> &operator+=(const QSet <i>other</i>)
QSet<T> &operator+=(const T <i>value</i>)
QSet<T> &operator-(const QSet <i>other</i>)
QSet<T> &operator-(const T <i>value</i>)
QSet<T> &operator<<(const T <i>value</i>)
booloperator==(const QSet <i>other</i>) const
QSet<T> &operator|=(const QSet <i>other</i>)
QSet<T> &operator|=(const T <i>value</i>)
(since 6.1) qsizetypeerase_if(QSet <i>set</i>, Predicate pred)
QSetoperator&(const QSet <i>lhs</i>, const QSet <i>rhs</i>)
QSetoperator&(QSet <i>lhs</i> &<i>rhs</i>, const QSet <i>rhs</i>)
QSetoperator+(const QSet <i>lhs</i>, const QSet <i>rhs</i>)
QSetoperator+(QSet <i>lhs</i> &<i>rhs</i>, const QSet <i>rhs</i>)
QSetoperator-(const QSet <i>lhs</i>, const QSet <i>rhs</i>)
QSetoperator-(QSet <i>lhs</i> &<i>rhs</i>, const QSet <i>rhs</i>)
QDataStream &operator<<(QDataStream &<i>out</i>, const QSet <i>set</i>)
QDataStream &operator>>(QDataStream &<i>in</i>, QSet <i>set</i>)
QSetoperator|(const QSet <i>lhs</i>, const QSet <i>rhs</i>)
QSetoperator|(QSet <i>lhs</i> &<i>rhs</i>, const QSet <i>rhs</i>)

详细信息

QSet 是 Qt 的泛型 容器类 之一。它按照未指定的顺序存储值,并能提供非常快的值查找。在内部,QSet 实现 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 样式迭代器(QSetIteratorQMutableSetIterator)和 STL 样式迭代器(QSet::iteratorQSet::const_iterator)。以下是使用 Java 风格迭代器遍历 QSetQWidget * 的示例

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

以下是相同的代码,但使用 STL 样式迭代器

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

QSet 没有顺序,因此不能假设迭代器的顺序是可预测的。如果你需要按键排序,请使用 QMap

您也可以使用基于范围的 for 循环来遍历 QSet。

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

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

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

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

另请参阅 QSetIteratorQMutableSetIteratorQHashQMap

成员类型文档

QSet::ConstIterator

Qt风格的别名,对应于 QSet::const_iterator

QSet::Iterator

Qt风格的别名,对应于 QSet::iterator

QSet::const_pointer

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)

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

另请参阅 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] 中的内容。

输入迭代器的值类型必须可转换为 T

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

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

返回一个位于集合第一个项目的 const STL-style iterator

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

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

这是一个重载函数。

返回一个位于集合第一个项目的非const STL-style iterator

qsizetype QSet::capacity() const

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

此函数的唯一目的是提供调整 QSet's 内存使用的手段。通常情况下,您很少需要调用此函数。如果您想了解集合中有多少项,请调用 size。(请注意,这是简化的翻译,可能需要根据实际情况进行调整。)

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

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

返回一个位于集合第一个项目的 const STL-style iterator

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

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

返回一个指向集合中最后一个项目的假设项目的 const STL-style iterator

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

void QSet::clear()

从集合中删除所有元素。

参考 remove().

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

返回一个位于集合第一个项目的 const STL-style iterator

参考 begin() 和 constEnd().

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

返回一个指向集合中最后一个项目的假设项目的 const STL-style iterator

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

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

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

参考 find() 和 contains().

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

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

参考 insertremovefind().

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

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

参考 insertremovefind().

qsizetype QSet::count() const

size 相同。

bool QSet::empty() const

如果集合为空,则返回 true。此函数提供以与 STL 兼容。它与 isEmpty 相等。

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

返回一个定位在集合中最后一个项目的想象中的项目之后的常量迭代器。

参考 constEnd() 和 begin().

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

这是一个重载函数。

返回一个指向集合中最后一个项目的想象中的项目的非常量迭代器。

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

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

remove 不同,此函数永远不会导致 QSet 重新散列其内部数据结构。这意味着可以安全地在此过程中调用它,并且不会影响集合中项目的顺序。

注意:迭代器 pos 必须 是有效的并可解引用。对此方法的其他任何迭代器(包括它的 own 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)

这是一个重载函数。

返回一个非const迭代器,指向集合中的项目 value。如果集合不包含项目 value,则该函数返回end()。

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

如果 value 不已在集合中,将其插入集合,并返回指向插入项的迭代器。

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

[since 6.1] QSet<T>::iterator QSet::insert(QSet<T>::const_iterator it, const T &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)

从集合中移除任何< i translate="no">value项。如果实际上移除了一个项,则返回 true;否则返回 false

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

[自 6.1 版起] 模板 <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 的泛型容器类可用作范围构造函数,应使用这些构造函数代替此方法。

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

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

如果other集合与此集合不相等,则返回 true;否则返回 false

如果两个集合包含相同的元素,则认为它们是相等的。

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

另请参阅operator==

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

intersect(other)相同。

另请参阅operator&operator|operator-

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

这是一个重载函数。

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

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

subtract(other)相同。

另请参阅operator-operator|operator&

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

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

参考 remove().

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

如果other集合与此集合相等,则返回 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<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] 模板 <typename T, typename Predicate> qsizetype erase_if(QSet<T> &set, Predicate pred)

删除所有满足谓词 pred 返回 true 的元素集合 set。如果有任何元素被移除,则返回其数量。

此函数于 Qt 6.1 中引入。

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

将集合 set 写入流 out 中。

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

另请参阅 QDataStream运算符的格式

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

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

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

另请参阅 QDataStream运算符的格式

© 2024 The Qt Company Ltd. 包含在内的文档贡献是各自所有者的版权。本提供的文档是根据由自由软件基金会发布的内容受 GNU自由文档许可版本1.3 的条款授权的。Qt及其相关的标志是芬兰和在/或全球的其他地区的The Qt Company Ltd的<φ商标所有。所有其他商标均为各自所有者的财产。