本案例对应的源代码目录:src/chapter04/ks04_05。
在软件研发过程中,数据结构是个无论如何也不能回避的话题。包括STL在内,很多第三方库都对常用数据结构进行了模板化封装。从本节课开始,将介绍Qt封装的几个常用数据结构模板类,本节先介绍数组类QVector。学过C++的人员都知道数组的成员在内存中是连续存放的,因此使用下标访问数组成员时效率是非常高的。但是当扩大数组容量时,有可能需要重新申请内存,然后将旧的数组成员复制到新内存中,这会损失一些性能。所以如果经常对数据集进行插入、删除元素的操作,那么不建议使用数组。OK,回归正题,本节设计了3个场景来介绍QVector。
(1)向QVector中添加成员并遍历。
(2)向QVector中添加自定义类的对象。
(3)向QVector中添加自定义类对象的指针。
首先简单说一下课程附件代码。因为要用到命令行来接受用户输入,因此需要在pro中修改CONFIG参数项。
因为要用到QVector,所以请在文件开头增加对的包含语句。#include
下面分别看一下这3个场景的案例。
1.向QVector中添加成员并遍历
在代码清单4-28中,将int类型的数据添加到QVector。如果把int换成Qt的类,代码也类似。
代码清单4-28/**
* @brief向QVector添加成员并遍历。
* @return无
*/
void example01(){
//添加成员
QVector vecId;
vecId.push_back(2011);
vecId.push_back(2033);
vecId.push_back(2033);
vecId.push_back(2042);
vecId.push_back(2045);
// push_front
vecId.push_front(2046);
...
}
代码清单4-28中,建立了一个成员类型为quint32的数组。这是一个整数数组,数组名称为vecId。调用push_back()接口可以向数组中添加成员。push_back()的功能是将新加入的成员添加到数组的尾部,而push_front()接口则负责将成员添加到数组的首部,也就是下标为0的位置。可以将数组的成员打印到终端来印证这一点,见代码清单4-29。
代码清单4-29// example01()
//遍历成员-使用下标
cout << endl << "-------------- QVector ---------------" << endl;
cout << "print members using index ......" << endl;
int idxVec = 0;
for (idxVec = 0; idxVec < vecId.size(); idxVec++) {
cout << " vecId[" << idxVec << "] =" << vecId[idxVec] << endl;
}
在代码清单4-29中,使用下标遍历数组的成员。语法同访问C++中的普通数组成员一样:数组名[下标]。另外,通过正序迭代器(简称迭代器)来访问数组成员也非常方便,见代码清单4-30。
代码清单4-30// example01()
//遍历成员-使用迭代器(正序)
cout << endl << "-------------- QVector ---------------" << endl;
cout << "print members using iterator......" << endl;
QVector::iterator iteVec = vecId.begin();①
idxVec = 0;
for (iteVec = vecId.begin(); iteVec != vecId.end(); iteVec++, idxVec++) {②
cout << " " <&l