Qt中的通用模板算法QtAlgorithms(qDeleteAll,qBinaryFind,qCountLeadingZeroBits,qPopulationCount,qFill,qSwap,qSort)
Qt在<QtAlgorithms>头文件中为我们提供了一系列的全局模板方法,这些模板方法主要用于容器操作,比如qDeleteAll()。其在Qt中的声明如下:
void qDeleteAll(ForwardIterator begin, ForwardIterator end)
void qDeleteAll(const Container &c)
该方法接受一个容器或由两个迭代器确定的容器区间,其作用是对容器中的每一个元素调用operator delete释放元素所占用的空间。所以,作为参数传递的容器中的元素必须是non-const 指针类型,不能是基本数据类型。同时,这些算法能用于任何具有STL风格迭代器的容器,包括QList,QLinkedList,QVector, QMap,QHash等。注意,qDeleteAll() 只是释放容器中每个指针元素所占用的空间,并不会清空容器或容器区间。比如,
QList<Employee *> list;
list.append(new Employee("Blackpool", "Stephen"));
list.append(new Employee("Twist", "Oliver"));
qDeleteAll(list.begin(), list.end());
list.clear();
像上面的例子所示,如果我们想清空容器,必须手动调用一下容器的相关成员函数。另一方面,当qDeleteAll() 应用于关联容器时,如QMap,QHash等,这些容器中往往存放的都是key-value对,但qDeleteAll() 只能释放value所对应的内存空间,而不能释放key所对应的内存空间。
大部分方法都和上面一样接受STL风格的迭代器作为参数,并且由于这些方法是通用方法,不依赖具体的迭代器类,所以可以将任何满足条件的迭代器作为参数传入。当然,迭代器的类型要和方法的需求一致,比如qFill() 方法接受两个forward iterator,就必须传递两个前向迭代器进去,否则会引发编译错误。并且我们知道在STL中,任何行为像迭代器的东西就是迭代器。对于Qt来说也是一样,所以,这些方法不仅仅能应用于标准的Qt容器和STL容器,也可以应用于普通的数组和指针。比如,下面的例子,对于name_table数组中的每一个HTML实体,在value_table中查找该实体所对应的Unicode编码。因为name_table 是按字母排序的,所以此处可以使用qBinaryFind() 进行二分查找。
QChar resolveEntity(const QString &entity)
{
static const QLatin1String name_table[] = { "AElig", "Aacute", ..., "zwnj"};
static const ushort value_table[] = {0x0061, 0x00c1, ..., 0x200c};
int N = sizeof(name_table) / sizeof(name_table[0]);
const QLatin1String *name = qBinaryFind(name_table, name_table + N, entity);
int index = name - name_table;
if (index == N)
return QChar();
return QChar(value_table[index]);
}
Qt容器所支持的迭代器类型
上面说到这些通用算法主要用于操作容器,而操作容器最常用的方式就是使用迭代器,所以,我们在看一下Qt中所支持的迭代器类型:
输入迭代器
输入迭代器可以用来从一个容器中顺序的读取数据。所以这种迭代器必须提供==和!=运算符来比较两个迭代器是否相等,同时还得有取得每项数据的*运算符和迭代到下一项的++运算符。Qt中容器的迭代器类型都是输入迭代器。
输出迭代器
输出迭代器用来想容器中顺序的写入数据。其操作和上面的输入迭代器大同小异。其也提供了用于存取数据的*运算符和迭代到下一项的++运算符。Qt容器的non-const 迭代器都是输入迭代器。
前向迭代器
前向迭代器其实就是 既满足输入迭代器的要求又满足输出迭代器的要求的一种迭代器。Qt容器的所有non-const容器都是前向迭代器。
双向迭代器
双向迭代器除了满足前向迭代器的要求外,还提供了--运算符以实现向后迭代的功能。Qt容器的non-const迭代器都是双向迭代器。
随机存取迭代器
随机存取迭代器是最后一种,也是功能最强大的一种迭代器,它不仅支持双向迭代器的操作,还支持以下各种操作:
i += n 将迭代器想前步进n位
i -= n 将迭代器向后步进n位
i +n or n + i 返回迭代器i前面n位所对应的迭代器
i - n 返回迭代器i后面n位所对应的迭代器
i - j 返回迭代器i 和 j 之间的元素的个数
i[n] 等价于 *(i + n)
i < j 比较迭代器i是否在迭代器j的后面
Qt中的QList 和 QVector 的non-const 迭代器是随机存取迭代器。
其他通用方法
除了上面的qDeleteAll() 算法,Qt在<QtAlgorithms>头文件里还为我们提供了另外两个通用方法,声明如下:
uint qCountLeadingZeroBits(quint32 v)
uint qCountLeadingZeroBits(quint8 v)
uint qCountLeadingZeroBits(quint16 v)
uint qCountLeadingZeroBits(quint64 v)
uint qCountTrailingZeroBits(quint32 v)
uint qCountTrailingZeroBits(quint8 v)
uint qCountTrailingZeroBits(quint16 v)
uint qCountTrailingZeroBits(quint64 v)
uint qPopulationCount(quint32 v)
uint qPopulationCount(quint8 v)
uint qPopulationCount(quint16 v)
uint qPopulationCount(quint64 v)
qCountLeadingZeroBits() 用于计算一个整数所对应的二进制数中从最高位(MSB)算起有多少个0,比如 qCountLeadingZeroBits(8) 返回28,因为十进制 “8” 所对应的二进制是“1000”,总共32位,所以从最高位算起有28个0。
qCountTrailingZeroBits() 的作用同上,只不过其返回的是从最低有效位(LSB)算起有多少个0。
qPopulationCount() 返回一个整数的二进制表示中 1 的个数。该个数称为 数字的 “汉明权重”。关于“汉明权重”的详细信息可参看维基百科汉明权重。
被废弃的通用方法
除了上面说的三个通用方法,其实Qt还提供了其他的通用方法,比如上面提到过的qBinaryFind()。但由于这些通用方法大多和STL中的标准算法功能重复,所以,从Qt5.0开始,这些就被标记为废弃的函数,而建议大家直接使用STL中的标准算法。Qt5.7中所列的被废弃的算法如下:
RandomAccessIterator qBinaryFind(RandomAccessIterator begin, RandomAccessIterator end, const T &value)
RandomAccessIterator qBinaryFind(RandomAccessIterator begin, RandomAccessIterator end, const T &value, LessThan lessThan)
Container::const_iterator qBinaryFind(const Container &container, const T &value)
OutputIterator qCopy(InputIterator begin1, InputIterator end1, OutputIterator begin2)
BiIterator2 qCopyBackward(BiIterator1 begin1, BiIterator1 end1, BiIterator2 end2)
void qCount(InputIterator begin, InputIterator end, const T &value, Size &n)
void qCount(const Container &container, const T &value, Size &n)
bool qEqual(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2)
void qFill(ForwardIterator begin, ForwardIterator end, const T &value)
void qFill(Container &container, const T &value)
InputIterator qFind(InputIterator begin, InputIterator end, const T &value)
Container::const_iterator qFind(const Container &container, const T &value)
LessThan qGreater()
LessThan qLess()
RandomAccessIterator qLowerBound(RandomAccessIterator begin, RandomAccessIterator end, const T &value)
RandomAccessIterator qLowerBound(RandomAccessIterator begin, RandomAccessIterator end, const T &value, LessThan lessThan)
Container::const_iterator qLowerBound(const Container &container, const T &value)
void qSort(RandomAccessIterator begin, RandomAccessIterator end)
void qSort(RandomAccessIterator begin, RandomAccessIterator end, LessThan lessThan)
void qSort(Container &container)
void qStableSort(RandomAccessIterator begin, RandomAccessIterator end)
void qStableSort(RandomAccessIterator begin, RandomAccessIterator end, LessThan lessThan)
void qStableSort(Container &container)
void qSwap(T &var1, T &var2)
RandomAccessIterator qUpperBound(RandomAccessIterator begin, RandomAccessIterator end, const T &value)
RandomAccessIterator qUpperBound(RandomAccessIterator begin, RandomAccessIterator end, const T &value, LessThan lessThan)
Container::const_iterator qUpperBound(const Container &container, const T &value)
这些函数大都可以见名知意,在此就不详细讲解了。另外,这些函数被标记为废弃,但并未从qt中移除,所以关于每个函数的具体信息,可参看Qt帮助文档。但还是建议不要使用这些被废弃的函数,以免这些函数在将来的某个版本被移除而导致代码的不可移植性。
---------------------
作者:求道玉
来源:CSDN
原文:https://blog.csdn.net/Amnes1a/article/details/60868344
版权声明:本文为博主原创文章,转载请附上博文链接!
Qt中的通用模板算法QtAlgorithms(qDeleteAll,qBinaryFind,qCountLeadingZeroBits,qPopulationCount,qFill,qSwap,qSort)的更多相关文章
- 智能指针类模板(中)——Qt中的智能指针
Qt中的智能指针-QPointer .当其指向的对象被销毁时,它会被自动置空 .析构时不会自动销毁所指向的对象-QSharedPointer .引用计数型智能指针 .可以被自由的拷贝和赋值 .当引用计 ...
- Qt中的常用容器类(解释比较全面,有插图)
在Qt库中为我们提供了一系列的基于模板的容器类.这些类可以被用来存储特定类型的项.例如,如果你需要一个大小可以变得QString数组,那么可以使用QVector<QString>. 这些容 ...
- QT中静态库的生成与使用
一. 静态库的生成 1. 测试目录: lib 2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为&qu ...
- QT中共享库的生成与使用
一. 静态库的生成1. 测试目录: lib2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为"I'm i ...
- QT中静态库的生成与使用——创建共享库代码,附例子
一. 静态库的生成 1. 测试目录: lib 2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为&qu ...
- (转载)QT中PRO文件写法的详细介绍,很有用,很重要!
版权声明:本文为博主原创文章,未经博主允许不得转载. 在QT中,有一个工具qmake可以生成一个makefile文件,它是由.pro文件生成而来的,.pro文件的写法如下: 1. 注释从“#”开始,到 ...
- 第11课 Qt中的字符串类
1. 历史遗留问题和解决方案 (1)历史遗留问题 ①C语言不支持真正意义上的字符串 ②C语言用字符数组和一组函数实现字符串操作 ③C语言不支持自定义类型,因此无法获得字符串类型 (2)解决方案 ①从C ...
- QT 中 关键字讲解(emit,signal,slot)
Qt中的类库有接近一半是从基类QObject上继承下来,信号与反应槽(signals/slot)机制就是用来在QObject类或其子类间通讯的方法.作为一种通用的处理机制,信号与反应槽非常灵活,可以携 ...
- Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构
分享两篇Win 10应用开发的XML文档结构:Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构. Win 10 开发中Adapt ...
随机推荐
- 树(tree)
树(tree)[题目描述]从前在森林里面有一棵很大的树,树上住着很多小动物.树上有
- python正则表达式从路径中取文件名出来不加后缀(txt)
正则表达式[^\\/:*?"<>|\r\n]+$ ---->取文件名包括后缀 e.g. >>>D:\PyCharm 2018.2.4\pythonWork ...
- ACM信息汇总
一.ACM算法总结及刷题参考 (摘自:http://www.cnblogs.com/flipped/p/5005693.html) 初期: 一.基本算法: (1)枚举. (poj1753,poj296 ...
- novell.directory.ldap获取邮箱活动目录
在windows系统上可以使用下列方法来查找所有的员工邮箱和员工组: StringDictionary ReturnArray = new StringDictionary(); Dictionary ...
- arcgis10安装及破解
操作系统:win7 arcgis版本:10.0 1.运行arcgis10安装包里的esri.exe,出现以下安装界面.先点“许可管理器”的“安装”,一路点下去,什么都不用管. 2.完成后在lic ...
- 如何简单去掉dede后台的验证码 dedecms5.7 验证码怎么去掉
很多朋友都在找,如何去掉dede后台的验证码,每次登陆都很繁琐. 现在教大家一个dedecms5.7 验证码怎么去掉的最直接的方法: 在dedecms5.7[验证码安全设置]里,说修改后 ...
- Java线程状态中BLOCKED和WAITING有什么差别?
刚才在看CSDN的问答时.发现这个问题. 原问题的作者是在观察jstack的输出时提出的疑问.那么BLOCKED和WAITING有什么差别呢? 答复在JDK源代码中能够找到,例如以下是java.lan ...
- openfire常见几类插件开发研究与总结
openfire 的插件可以访问所有openfire的API,这给我们的插件实现提供了巨大的灵活性. 以下介绍几类比较常用的插件集成方式: 基于源码XMPP协议的插件 比如:IQHandler,常用来 ...
- Python 可视化Twitter中指定话题中Tweet的词汇频率
CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-7-8 @author: guaguastd @name: pl ...
- vue2.0 仿手机新闻站(一)项目开发流程
vue仿手机新闻站: 1.拿到静态页面,直接用vue边布局,边写 2.假数据 没有用任何UI组件,切图完成 做项目基本流程: 1.规划组件结构 Nav.vue Header.vue Home.vue ...