Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5790008
  • 博文数量: 409
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 8273
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-23 19:15
个人简介

qq:78080458 学习交流群:150633458

文章分类

全部博文(409)

文章存档

2019年(127)

2018年(130)

2016年(20)

2015年(60)

2014年(41)

2013年(31)

分类: 嵌入式

2016-02-02 11:47:06

一、容器
容器类用于存储给定数据类型的值,它是模板类,根据提供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相同

六、案列

点击(此处)折叠或打开

  1. #include <QVectorIterator>
  2. #include <iostream>
  3. using namespace std;
  4. #include <QApplication>
  5. #include <QVector>
  6. #include <QString>
  7. #include <QMap>
  8. int main(int argc, char *argv[])
  9. {
  10.     QApplication app(argc, argv);
  11. /********************************************
  12.  * 指定大小 QVector<int> vect(3);
  13.  * 使用 vect[0]=1;
  14.  *******************************************/
  15.     QVector<int> vect0(3);
  16.     vect0[0] = 1;
  17.     vect0[1] = 2;
  18.     vect0[2] = 3;
  19.     cout<<vect0[0]<<"\t"<<vect0[1]<<"\t"<<vect0[2]<<endl;
  20. /********************************************
  21.  * 未定大小 QVector<int> vect;
  22.  * 使用 vect.append(1);
  23.  * 或者 vect<<1<<3<<5;
  24.  *******************************************/
  25.     QVector<int> vect1;
  26.     vect1<<1<<3;
  27.     vect1.append(5);
  28.     cout<<vect1[0]<<"\t"<<vect1[1]<<"\t"<<vect1[2]<<endl;
  29. /********************************************
  30.  * fill(i, T)填充数据
  31.  * at()只读查看
  32.  * data()返回头指针
  33.  * insert(i, T)插入
  34.  * indexOf(i, T)查找位置
  35.  * count(T)统计
  36.  *******************************************/
  37.     QVector<string> vect2;
  38.     vect2.fill("hello", 3);
  39.     cout<<vect2[1]<<endl;
  40.     if(vect2.at(1)=="hello")
  41.         cout<<"HEHE"<<endl;

  42.     vect2.insert(2, "world");
  43.     cout<<vect2.indexOf("world", 0)<<endl;
  44.     cout<<vect2.contains("hello")<<endl;
  45.     cout<<vect2.count("hello")<<endl;

  46. /********************************************
  47.  * 迭代器
  48.  * hasNext()
  49.  * next()
  50.  * foreach(T, QVector)
  51.  *******************************************/

  52.     for(QVectorIterator<string> iterator(vect2); iterator.hasNext();)
  53.         cout<<iterator.next()<<endl;
  54.     
  55.     foreach(string str, vect2)
  56.         cout<<str<<endl;

  57.     QMap<int, string> map;
  58.     map.insert(1, "weijie");
  59.     map[2] = "hehe";
  60.     cout<<map[1]<<endl;
  61.     cout<<map.value(2)<<endl;
  62.     
  63.     
  64.     return app.exec();
  65. }








 


 




 




 


阅读(1655) | 评论(0) | 转发(0) |
0

上一篇:lesson6-表

下一篇:lesson8-目录和文件

给主人留下些什么吧!~~