<QtAlgorithms> - Generic Algorithms
<QtAlgorithms> 头文件包含了一系列基于模板的通用算法。更多内容...
| Header: | #include <QtAlgorithms> |
函数
| uint | qCountLeadingZeroBits(quint16 v) |
| uint | qCountLeadingZeroBits(quint32 v) |
| uint | qCountLeadingZeroBits(quint64 v) |
| uint | qCountLeadingZeroBits(quint8 v) |
| uint | qCountTrailingZeroBits(quint8 v) |
| uint | qCountTrailingZeroBits(quint16 v) |
| uint | qCountTrailingZeroBits(quint32 v) |
| uint | qCountTrailingZeroBits(quint64 v) |
| void | qDeleteAll(ForwardIterator begin, ForwardIterator end) |
| void | qDeleteAll(const Container &c) |
(since 6.10) Result | qJoin(InputIterator first, InputIterator last, Result init, const Separator &separator = {}, Projection p = {}) |
| uint | qPopulationCount(quint8 v) |
| uint | qPopulationCount(quint16 v) |
| uint | qPopulationCount(quint32 v) |
| uint | qPopulationCount(quint64 v) |
详细说明
Qt 在 `<QtAlgorithms> ` 中提供了一系列全局模板函数,这些函数作用于容器并执行一些简便操作,从而简化开发工作,例如 `qDeleteAll()` 函数,它会对给定容器中的所有项或给定范围内的项调用 `operator delete `。您可以将这些算法与任何提供 STL 风格迭代器的容器类配合使用,包括 Qt 的 `QList`、`QMap` 和 `QHash ` 类。
大多数算法都将STL 风格的迭代器作为参数。这些算法具有泛型特性,即它们并不局限于特定的迭代器类;只要迭代器满足特定的一组要求,您就可以使用它们。
不同的算法对所接受的迭代器可能有不同的要求。每种算法都会指定所需的迭代器类型。如果传入的迭代器类型不正确(例如,将QList::ConstIterator 作为output iterator 传入),您总会收到编译器报错,尽管该报错未必非常具体。
某些算法对容器中存储的值类型有特殊要求。例如,qDeleteAll() 要求值类型为非 const 指针类型(例如QWidget *)。每个算法都会明确指定值类型的要求,若未满足要求,编译器将报错。
通用算法不仅可用于 Qt 和 STL 提供的容器类,也可用于其他容器类。STL 风格迭代器的语法参照 C++ 指针设计,因此可以将普通数组用作容器,将普通指针用作迭代器。
迭代器类型
算法对所接受的迭代器类型有特定要求,这些要求针对每个函数分别进行了指定。如果未满足要求,编译器将报错。
输入迭代器
输入迭代器是一种可用于从容器中顺序读取数据的迭代器。它必须提供以下运算符:用于比较两个迭代器的== 和!= ,用于检索项目中存储值的单目运算符* ,以及用于前进到下一个项目的前缀运算符++ 。
Qt 容器中的迭代器类型(const 和 non-const)均为输入迭代器。
输出迭代器
输出迭代器是一种可用于将数据依次写入容器或某些输出流的迭代器。它必须提供以下运算符:用于写入值的单目运算符* (即*it = val )以及用于前进到下一个项的前缀运算符++ 。
Qt 容器中的非 const 迭代器类型均为输出迭代器。
前向迭代器
前向迭代器是一种同时满足输入迭代器和输出迭代器要求的迭代器。
Qt 容器中的非 const 迭代器类型都是前向迭代器。
双向迭代器
双向迭代器是一种既满足前向迭代器要求,又支持前缀-- 以实现向后迭代的迭代器。
Qt 容器中的非 const 迭代器类型都是双向迭代器。
随机访问迭代器
最后一类——随机访问迭代器——是最强大的迭代器类型。它不仅满足双向迭代器的所有要求,还支持以下操作:
i += n | 将迭代器i 向前移动n 个位置 |
i -= n | 将迭代器i 向后移动n 个位置 |
i + n 或者n + i | 返回位于迭代器前方n 个位置处的项的迭代器i |
i - n | 返回位于迭代器后方n 个位置处的项的迭代器i |
i - j | 返回迭代器i 和j |
i[n] | 与*(i + n) |
i < j | 若迭代器j 位于迭代器之后,则返回true i |
QList的非 const 迭代器类型为随机访问迭代器。
另请参阅 容器类和<QtGlobal> 。
函数文档
[constexpr noexcept] uint qCountLeadingZeroBits(quint16 v)
返回从最高有效位(MSB)开始搜索时,v 中连续的零位数量。例如,qCountLeadingZeroBits(quint16(1)) 返回 15,而 qCountLeadingZeroBits(quint16(8)) 返回 12。
[constexpr noexcept] uint qCountLeadingZeroBits(quint32 v)
返回从最高有效位(MSB)开始搜索时,v 中连续零位的个数。例如,qCountLeadingZeroBits(quint32(1)) 返回 31,而 qCountLeadingZeroBits(quint32(8)) 返回 28。
[constexpr noexcept] uint qCountLeadingZeroBits(quint64 v)
返回从最高有效位(MSB)开始搜索时,v 中连续零位的数量。例如,qCountLeadingZeroBits(quint64(1)) 返回 63,而 qCountLeadingZeroBits(quint64(8)) 返回 60。
[constexpr noexcept] uint qCountLeadingZeroBits(quint8 v)
返回从最高有效位(MSB)开始搜索时,v 中连续零位的数量。例如,qCountLeadingZeroBits(quint8(1)) 返回 7,而 qCountLeadingZeroBits(quint8(8)) 返回 4。
[constexpr noexcept] uint qCountTrailingZeroBits(quint8 v)
返回从最低有效位(LSB)开始搜索时,v 中连续零位的个数。例如,qCountTrailingZeroBits(1) 返回 0,而 qCountTrailingZeroBits(8) 返回 3。
[constexpr noexcept] uint qCountTrailingZeroBits(quint16 v)
这是一个重载函数。
[constexpr noexcept] uint qCountTrailingZeroBits(quint32 v)
这是一个重载函数。
[constexpr noexcept] uint qCountTrailingZeroBits(quint64 v)
这是一个重载函数。
template <typename ForwardIterator> void qDeleteAll(ForwardIterator begin, ForwardIterator end)
使用 C++delete 运算符删除范围 [begin,end) 内的所有项。项的类型必须是指针类型(例如,QWidget * )。
示例:
QList<QColor *> list;
list.append(new QColor(Qt::blue));
list.append(new QColor(Qt::yellow));
qDeleteAll(list.begin(), list.end());
list.clear();请注意,qDeleteAll() 并不会从容器中移除项;它只是对这些项调用delete 。在上面的示例中,我们通过调用容器的 clear() 方法来移除这些项。
该函数也可用于删除存储在关联容器(如QMap 和QHash )中的项。此函数仅会删除各容器中存储的对象;用作键的对象不会被删除。
另请参阅 forward iterators 。
template <typename Container> void qDeleteAll(const Container &c)
这与 qDeleteAll(c.begin(),c.end()) 效果相同。
这是一个重载函数。
[since 6.10] template <
typename InputIterator,
typename Result,
typename Separator = Result,
typename Projection = std::identity
>
Result qJoin(InputIterator first, InputIterator last, Result init, const Separator &separator = {}, Projection p = {})
以初始值 `init ` 为起点,并将范围 `first ` 至 `last` 内的每个条目累加至该值。在累加之前,每个条目都会通过投影 `p `(默认值为单位映射)进行映射。在每个条目与下一个条目之间,可选地添加一个 `separator `。例如:
QList<int> l = {1, 2, 3};
QString res = qJoin(l.cbegin(), l.cend(), QString(), u" / ",
[](int n) { return QString::number(2 * n);});
// res == "2 / 4 / 6"注意: q20::identity 是 C++20 标准中 std::identity的 C++17 向后移植版本。
该函数在 Qt 6.10 中引入。
[constexpr noexcept] uint qPopulationCount(quint8 v)
返回v 中被设为1的位数。该数值也被称为v 的汉明权。
[constexpr noexcept] uint qPopulationCount(quint16 v)
这是一个重载函数。
[constexpr noexcept] uint qPopulationCount(quint32 v)
这是一个重载函数。
[constexpr noexcept] uint qPopulationCount(quint64 v)
这是一个重载函数。
© 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.