一、容器
容器类用于存储给定数据类型的值,它是模板类,根据提供T的不同,存储不同的数据
c++的标准库也提供了模板类,但是Qt的模板更加安全。在一些嵌入式设备上,通常只能使用Qt容器类
Qt的容器有连续容器和关联容器
连续容器:QVector、 QLinkedList、 QList
关联容器:QMap、 QHash
容器类用于存储给定数据类型的值,它是模板类,根据提供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 初始化
普通的数据或指针初始化为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相同
六、案列
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 初始化
普通的数据或指针初始化为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风格的迭代器:
![](https://i-blog.csdnimg.cn/blog_migrate/1aa1f55685818466b3149d945147307c.png)
java风格的迭代器,迭代点位于l列表x项的z中间,并非指向某个列表项
![](https://i-blog.csdnimg.cn/blog_migrate/b646c6150bca6f8b7c3feedca97cb50f.png)
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迭代器
![](https://i-blog.csdnimg.cn/blog_migrate/d6a386ec88af53f358b37ab456c4ce94.png)
STL迭代器的迭代点会指向某一个列表项
![](https://i-blog.csdnimg.cn/blog_migrate/6ff98a09b75de5d89d96622f1da5bb04.png)
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也提供了两种风格的迭代器
![](https://i-blog.csdnimg.cn/blog_migrate/c67157a316a7a779e9f2094d389087a5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/43084cbfe6e6f61b5f3e5d3656734998.png)
五、 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);
- /********************************************
- * 指定大小 QVectorint> vect(3);
- * 使用 vect[0]=1;
- *******************************************/
- QVectorint> vect0(3);
- vect0[0] = 1;
- vect0[1] = 2;
- vect0[2] = 3;
- coutvect0[0]"\t"vect0[1]"\t"vect0[2]endl;
- /********************************************
- * 未定大小 QVectorint> vect;
- * 使用 vect.append(1);
- * 或者 vect135;
- *******************************************/
- QVectorint> vect1;
- vect113;
- vect1.append(5);
- coutvect1[0]"\t"vect1[1]"\t"vect1[2]endl;
- /********************************************
- * fill(i, T)填充数据
- * at()只读查看
- * data()返回头指针
- * insert(i, T)插入
- * indexOf(i, T)查找位置
- * count(T)统计
- *******************************************/
- QVectorstring> vect2;
- vect2.fill("hello", 3);
- coutvect2[1]endl;
- if(vect2.at(1)=="hello")
- cout"HEHE"endl;
-
- vect2.insert(2, "world");
- coutvect2.indexOf("world", 0)endl;
- coutvect2.contains("hello")endl;
- coutvect2.count("hello")endl;
-
- /********************************************
- * 迭代器
- * hasNext()
- * next()
- * foreach(T, QVector)
- *******************************************/
-
- for(QVectorIteratorstring> iterator(vect2); iterator.hasNext();)
- coutiterator.next()endl;
-
- foreach(string str, vect2)
- coutstrendl;
-
- QMapint, string> map;
- map.insert(1, "weijie");
- map[2] = "hehe";
- coutmap[1]endl;
- coutmap.value(2)endl;
-
-
- return app.exec();
- }