五、QList与QLinkedList
5.1 QList类
对于不同的数据类型,QList<T>采取不同的存储策略,存储策略如下:
1. 如果T是一个指针类型或指针大小的基本类型(改基本类型占有的字节数和指针类型占有的字节数相同),QList<T>将数值直接存储在它的数组当中。
2. 如果QList<T>存储对象的指针,则该指针指向实际存储的对象。
由于QList很多功能和前面的类的功能相似,所以我们就不再一一赘述了。
5.1.1 查询元素
QList<int> l;
for(int i=0;i<10;i++)
l.insert(l.end(),i);
qDebug()<<l;
qDebug()<<l.at(2);
//输出结果
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
2
之所以在end()后面插入元素,是因为用到的赋值操作是insert()函数,所以我们在赋值的时候应该在每次列表的结尾赋值。
5.1.2 修改元素
l.replace(1,111);
qDebug()<<l;
//输出结果
(0, 111, 2, 3, 4, 5, 6, 7, 8, 9)
由于QList存储元素下标是从0开始的,所以replace(1,111)实际是修改的第二个元素的值。
5.1.3 删除元素
l.removeAt(0);
l.removeFirst();
qDebug()<<l;
//输出结果
(2, 3, 4, 5, 6, 7, 8, 9)
5.2 QLinkedList类
QLinkedList<T>是一个链式列表,它以非连续的内存块保存数据。QLinkedList<T>不能使用下标,只能使用迭代器访问它的数据项。与QList相比,当对一个很大的列表进行插入操作时,QLinkedList具有更高的效率。
注意:要引入QLinkedList头文件,因为QDebug头文件不包含QLinkedList。
5.2.1 实例化并输出
QLinkedList<QString> ll;
for(int i=1;i<=12;i++)
ll<<QString("%1%2").arg("month").arg(i);
QLinkedList<QString>::iterator it;
for(it=ll.begin();it!=ll.end();it++)
qDebug()<<*it;
//输出结果
"month1"
"month2"
"month3"
"month4"
"month5"
"month6"
"month7"
"month8"
"month9"
"month10"
"month11"
"month12"
QLinkedList类不能通过索引的方式访问元素,所以不能用qDebug()直接输出,必须用迭代器,而以上所有类,均可用java风格和STL风格的迭代器。