一、容器
容器类用于存储给定数据类型的值,它是模板类,根据提供T的不同,存储不同的数据
c++的标准库也提供了模板类,但是Qt的模板更加安全。在一些嵌入式设备上,通常只能使用Qt容器类
Qt的容器有连续容器和关联容器
连续容器:QVector
、 QLinkedList、 QList
关联容器:QMap、 QHash
二、QVector、QLinkedList、QList
1、QVector
1)、QVector概述
QVector
在相邻的内存中存储给定类型的数据,数据类型是多样的,可以是基本数据类型、指针、具有默认构造函数的类,还可以是一个容器。
Qt的QOBJECT类及其子类不能放在容器中
QVector和普通的C++数组几乎差不多,显著的区别是QVector的大小可以重新定义
2)、QVector使用
QVector使用:
指定大小
QVector vect(3);
vect[0] = 1; //通过下标赋值
不指定大小
QVector vect;
vect.append(1);//append方法在末端赋值
vect<<1<<2<<3; //也可以使用<<操作符代替append
初始化
普通的数据或指针初始化为0.对于“类”会调用默认的构造函数初始化
fill函数
vect.fill(1,10);//将容器全部填充为1,容器大小为10
vect.fill(2);//将容器全部填充为2,容器大小不改变
at()只读查看
vect.at(2);//查看容器中的第3项
//返回容器中第一项的指针
6、data()
//查看从指定位置开始的某一项T的位置
indexOf(T, int from=0)
contains(T)查看是否包含某一项
count(T)查看某一项被包含多少次
count()查看容器大小 == size()
resize(num)重置容器大小
修改数据
insert(int i, T);//在指定位置插入数据
replace(int i, T);//将指定位置数据替换
prepend(T);//在头部增加数据
append(T);//在尾部追加数据
2、QLinkedList
QLinkedList 以链表的形式存储数据,s是非连续的。在它的中间插入数据要比QVector容易很多,但是它不能用下标访问数据,只能使用迭代器。
如果要对一个很大的列表进行擦如操作的话,那么QLinkedList是首选
3、QList
QList 兼容了QLinkedList和QVector的优点,是一个“数组列表”。它既可以通过下标快速访问,而且在列表不是很大的情况下,也可以很容易的在中间插入数据。
QList维护的是一个数组指针,而不是数组
三、迭代器
1、java迭代器
迭代器用来遍历容器中的内容
Qt提供了两种java风格的迭代器:
java风格的迭代器,迭代点位于l列表x项的z中间,并非指向某个列表项
2、只读迭代器
QList list;
QListIterator iterator(list);
初始化完成之后,迭代点位于第一个列表项前面
iterator.hasPrevious();//检查迭代点前是否有列表项
iterator.hasNext();//检查迭代点后是否有列表项
iterator.toBack();//将迭代点移动到最后一个列表项后面
iterator.toFront();//将迭代点移动到d第一个列表项前面
iterator.next();//跳过下一个列表项,并返回跳过的内容
iterator.peekPrevious();//返回上一个列表项,不移动迭代点
iterator.peekNext();//返回下一个列表项,不移动迭代点
iterator.findNext(tmp);//向后查找指定项
iterator.findPrevious(tmp);//向前查找指定项
3、读写迭代器
QList list;
QMutableListIterator iterator(list);
iterator.insert(tmp);//在迭代点前插入内容
iterator.remove();//删除最后一次t跳过的n内容
iterator.setValue(tmp);//修改最后一次跳过的内容
4、STL迭代器
STL迭代器的迭代点会指向某一个列表项
5、foreach
foreach(string str, vect)会按照标准的for循环来实现,每一次的迭代过程中str都会被赋予新的值,从容器的第一项开始迭代。第一个参数是迭代的变量,第二个参数是容器。
四、QMap与QHash
1、QMap
Qt提供了两个关联容器类:
QMap QHash
关联容器可以存储任意多个相同类型的数据,并且有一个键值索引,通过键来读取数据。它一升序键的方式来c存储数据
定义一个QMap
QMap map;
//插入数据
map.insert(1, "weijie");
map.insert(2, "laowang");
map[key] = "hehe"; //下标是key
//读取数据
string temp;
temp = map.value(key);
temp = map[key];
//返回key和value的列表
QList keyList = map.keys();
QList valList = map.values();
2、QHash
QHash 以哈希表的形式存储数据,它的API和QMap的API几乎差不多
Qt为QMap和QHash也提供了两种风格的迭代器
五、QString
Qt有自己的字符串类,QString,它使用起来更加安全,不用担心结尾的'\0'。
对于字符串有丰富的操作,都封装在类中
QString str = "hello";
str += " world";
//追加
str.append("\n");
//移除两端的空白
trimed(str); //移除两端的空白
//组合字符串
str.sprintf("%s%s%s", "hello", "world", "\n");
str=QString(%1%3%2).arg("I").arg("you").arg("love");
QByteArray,主要存储原始的二进制数或者8位编码的文本。它的很火API和QString相同
六、案列
-
#include <QVectorIterator>
-
#include <iostream>
-
using namespace std;
-
#include <QApplication>
-
#include <QVector>
-
#include <QString>
-
#include <QMap>
-
int main(int argc, char *argv[])
-
{
-
QApplication app(argc, argv);
-
/********************************************
-
* 指定大小 QVector<int> vect(3);
-
* 使用 vect[0]=1;
-
*******************************************/
-
QVector<int> vect0(3);
-
vect0[0] = 1;
-
vect0[1] = 2;
-
vect0[2] = 3;
-
cout<<vect0[0]<<"\t"<<vect0[1]<<"\t"<<vect0[2]<<endl;
-
/********************************************
-
* 未定大小 QVector<int> vect;
-
* 使用 vect.append(1);
-
* 或者 vect<<1<<3<<5;
-
*******************************************/
-
QVector<int> vect1;
-
vect1<<1<<3;
-
vect1.append(5);
-
cout<<vect1[0]<<"\t"<<vect1[1]<<"\t"<<vect1[2]<<endl;
-
/********************************************
-
* fill(i, T)填充数据
-
* at()只读查看
-
* data()返回头指针
-
* insert(i, T)插入
-
* indexOf(i, T)查找位置
-
* count(T)统计
-
*******************************************/
-
QVector<string> vect2;
-
vect2.fill("hello", 3);
-
cout<<vect2[1]<<endl;
-
if(vect2.at(1)=="hello")
-
cout<<"HEHE"<<endl;
-
-
vect2.insert(2, "world");
-
cout<<vect2.indexOf("world", 0)<<endl;
-
cout<<vect2.contains("hello")<<endl;
-
cout<<vect2.count("hello")<<endl;
-
-
/********************************************
-
* 迭代器
-
* hasNext()
-
* next()
-
* foreach(T, QVector)
-
*******************************************/
-
-
for(QVectorIterator<string> iterator(vect2); iterator.hasNext();)
-
cout<<iterator.next()<<endl;
-
-
foreach(string str, vect2)
-
cout<<str<<endl;
-
-
QMap<int, string> map;
-
map.insert(1, "weijie");
-
map[2] = "hehe";
-
cout<<map[1]<<endl;
-
cout<<map.value(2)<<endl;
-
-
-
return app.exec();
-
}
阅读(1655) | 评论(0) | 转发(0) |