<QtAlgorithms> - 通用算法

<QtAlgorithms> 头文件包含基于模板的通用算法。 更多...

头部文件 #include <QtAlgorithms>

函数

uintqCountLeadingZeroBits(quint8 v)
uintqCountLeadingZeroBits(quint16 v)
uintqCountLeadingZeroBits(quint32 v)
uintqCountLeadingZeroBits(quint64 v)
uintqCountTrailingZeroBits(quint8 v)
uintqCountTrailingZeroBits(quint16 v)
uintqCountTrailingZeroBits(quint32 v)
uintqCountTrailingZeroBits(quint64 v)
voidqDeleteAll(ForwardIterator begin, ForwardIterator end)
voidqDeleteAll(const Container &c)
uintqPopulationCount(quint8 v)
uintqPopulationCount(quint16 v)
uintqPopulationCount(quint32 v)
uintqPopulationCount(quint64 v)

详细说明

Qt 在 <QtAlgorithms> 中提供了许多全局模板函数,这些函数在容器上工作并执行一些小的任务来简化编程,例如 qDeleteAll(),它会在给定的容器中的所有项目或给定的范围内调用来删除操作。您可以使用这些算法与任何提供 STL-style 迭代器的容器类一起使用,包括 Qt 的 QListQMapQHash 类。

大多数算法接收 STL-style iterators 作为参数。算法是通用的,因为它们并不绑定到特定的迭代器类;您可以将它们与任何满足一定要求的迭代器一起使用。

不同算法对它们接受的迭代器的需求可能不同。对于每个算法,所需迭代器类型都进行了指定。如果传递了错误的迭代器类型(例如,如果将 QList::ConstIterator 作为 输出迭代器 传递),则肯定会收到编译器错误,尽管可能不是非常有用的错误信息。

一些算法对容器中存储的值类型有特殊要求。例如,qDeleteAll() 要求值类型为非常量指针类型(例如,QWidget *)。每种算法的值类型要求都针对该算法进行指定,如果未满足要求,则编译器将产生错误。

泛型算法可以用于除 Qt 和 STL 提供的其他容器类之外的其他容器类。STL-style 迭代器的语法模仿 C++ 指针,因此可以使用普通数组作为容器,而普通指针作为迭代器。

迭代器类型

算法对其接受的迭代器类型有某些要求,并且这些要求为每个函数分别指定。如果未满足要求,则编译器将产生错误。

输入迭代器

输入迭代器 是可以用于从容器中按顺序读取数据的迭代器。它必须提供以下操作符:==!= 用于比较两个迭代器,一元 * 用于检索存储在项目中的值,以及前缀 ++ 用于前进到下一个项目。

Qt 容器的迭代器类型(常量和非常量)都是输入迭代器。

输出迭代器

输出迭代器 是可以将数据按顺序写入容器或某个输出流的迭代器。它必须提供以下操作符:一元 * 用于写入值(即,*it = val)和前缀 ++ 用于前进到下一个项。

Qt 容器的非常量迭代器类型都是输出迭代器。

前向迭代器

前向迭代器 是满足输入迭代器和输出迭代器要求的迭代器。

Qt 容器的非常量迭代器类型都是前向迭代器。

双向迭代器

双向迭代器 是满足前向迭代器要求的迭代器,此外还支持前缀 -- 用于向后迭代。

Qt 容器的非常量迭代器类型都是双向迭代器。

随机访问迭代器

最后一类,随机访问迭代器,是最强大的迭代器类型。它支持双向迭代器的所有要求,并支持以下操作

i += n使迭代器 i 前进 n 个位置
i -= n使迭代器 i 后退 n 个位置
i + nn + i返回项目在迭代器 i 之后 n 个位置的迭代器
i - n返回项目位于迭代器 i 之前 n 个位置的迭代器
i - j返回迭代器 ij 之间项目数
i[n]*(i + n) 相同
i < j如果迭代器 j 位于迭代器 i 之后,则返回 true

QList 的非常量迭代器类型是随机访问迭代器。

另请参阅容器类<QtGlobal>.

函数文档

[constexpr noexcept] uint qCountLeadingZeroBits(quint8 v)

返回从最高有效位开始搜索时,v中连续零位数的个数。例如,qCountLeadingZeroBits(quint8(1))返回7,qCountLeadingZeroBits(quint8(8))返回4。

[constexpr noexcept] uint qCountLeadingZeroBits(quint16 v)

返回从最高有效位开始搜索时,v中连续零位数的个数。例如,qCountLeadingZeroBits(quint16(1))返回15,qCountLeadingZeroBits(quint16(8))返回12。

[constexpr noexcept] uint qCountLeadingZeroBits(quint32 v)

返回从最高有效位开始搜索时,v中连续零位数的个数。例如,qCountLeadingZeroBits(quint32(1))返回31,qCountLeadingZeroBits(quint32(8))返回28。

[constexpr noexcept] uint qCountLeadingZeroBits(quint64 v)

返回从最高有效位开始搜索时,v中连续零位数的个数。例如,qCountLeadingZeroBits(quint64(1))返回63,qCountLeadingZeroBits(quint64(8))返回60。

[constexpr noexcept] uint qCountTrailingZeroBits(quint8 v)

返回从最低有效位开始搜索时,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)

这是一个重载函数。

<typename ForwardIterator> void qDeleteAll(ForwardIterator begin, ForwardIterator end)

使用C++ delete操作符删除范围[begin, end)内的所有项目。项目类型必须是指针类型(例如,QWidget *)。

示例

QList<Employee *> list;
list.append(new Employee("Blackpool", "Stephen"));
list.append(new Employee("Twist", "Oliver"));

qDeleteAll(list.begin(), list.end());
list.clear();

注意,qDeleteAll()不会从容器中删除项目;它只是对这些项目调用delete。在上面的示例中,我们调用clear()来删除项目。

此函数还可以用于删除存储在关联容器(如QMapQHash)中的项目。此函数将删除每个容器中存储的对象;用作键的对象将不会删除。

参阅前向迭代器

模板 <typename Container> void qDeleteAll(const Container &c)

这是一个重载函数。

这相当于 qDeleteAll(c.begin(), c.end())。

[constexpr noexcept] uint qPopulationCount(quint8 v)

返回 v 中设置的位数数。这个数字也称为 v 的汉明重量。

[constexpr noexcept] uint qPopulationCount(quint16 v)

这是一个重载函数。

[constexpr noexcept] uint qPopulationCount(quint32 v)

这是一个重载函数。

[constexpr noexcept] uint qPopulationCount(quint64 v)

这是一个重载函数。

© 2024 Qt公司。以下简称Qt公司的文档贡献是各自所有者的版权。本提供的文档受Free Software Foundation发布的GNU自由文档许可证版本1.3的条款许可。Qt和相应标志是芬兰及或全球其它国家Qt公司的商标。所有其他商标均为各自所有者的财产。