《Qt5 开发与实例(第三版)》学习笔记(二)

时间:2022-07-22 03:26:11
 1 //2.2 容器类  2 //储存在Qt容器的数据类型必须是可赋值的数据类型  3 //基本数据类型及Qt的一些数据类型如QString,QDate和QTime可以,但QObject及其子类不能储存在容器中,一个替代方案是储存其指针  4 //2.21 QList类,QLinkedList类和 QVector类  5 //时间复杂度比较见P29
 6 QList<T>;  7 QList::append();  8 QList::prepend();  9 QList::insert();  10 #include <QDebug>
 11 int main(int argc,char *argv[])  12 {  13     QList<QString> list;//声明一个QList<QString>栈对象
 14  {  15         QString str("This is a test string");  16         list<<str;// 注意是:<< ;通过操作运算符"<<"将一个QString字符串储存在该列表中
 17  }  18     QDebug()<<list[0]<<"How are you!";//可以使用下标
 19     return 0;  20 }  21 QLinkedList<T> //链式列表,以非连续的内存块储存数据,不能使用下标,只能用迭代器访问数据
 22 QVector<T> //在相邻的内存中储存数据,可以使用下标与迭代器  23 //Java风格迭代器,迭代点在列表项之间  24 //只读 QListIterator<T> 读写 QMutableListIterator<T> ,其它类似  25 //用于迭代
 26 #include <QDebug>//已经包含了QList的头文件
 27 int main(int argc ,char *argv[])  28 {  29     QList<int> list;  30     list<<1<<2<<3<<4<<5;  31     QListIterator<int> i(list);//以list为参数初始化一个QListIterator对象
 32     for(;i.hasNext();)//调用QListIterator<T>::hasNext()函数检查当前迭代点后是否有列表项
 33         QDebug()<<i.next();//调用next()函数进行遍历
 34     return 0;  35 }  36 //向前遍历的函数
 37 toBack();//到最后一个列表项
 38 hasPrevious();//类似
 39 previous();//类似
 40 toFront();//类似
 41 peekNext();//返回下一个列表项,但不移动迭代点
 42 peekPrevious();//类似
 43 findNext();//从当前迭代点向后移动寻找指定的列表项,若找到则返回true,否则返回false;迭代点在匹配项的后面或最后一个列表项的后面
 44 findPrevious();//类似  45 //以下为用控制台程序实现QList读写遍历方法
 46 #include <QDebug>
 47 int main(int argc, char *argv[])  48 {  49     QList<int> list;  50     QMutableListIterator<int> i(list);  51     for (int j=0;j<10;++j)  52  i.insert(j);  53     for(i.toFront();i.hasNext();)  54         QDebug()<<i.next();  55     for(i.toBack();i.hasPrevious();)  56  {  57         if(i.previous()%2==0)  58  i.remove();  59         else
 60             i.setValue(i.peekNext*10);//setValue();如果findNext()为参数,没有找到指定值则setValue()的调用将不会进行任何修改
 61  }  62     for(i.toFront();i.hasNext();)  63         QDebug<<i.next();  64     return 0;  65 }  66 //STL风格迭代器,迭代点直接指向列表项
 67 QList<T>::const_iterator //只读迭代器
 68 QList<T>::iterator //读写迭代器  69 //其他类似
 70 #include <QDebug>
 71 int main(int argc,char *argv[])  72 {  73     QList<int> list;  74     for(int j=0;j<10;j++)  75         list.insert(list.end(),j);//两个参数,第一个指定位置,第二个指定要插入的值
 76     QList<int> :: iterator i;  77     for(i=list.begin();i!=list.end();++i)  78  {  79         QDebug()<<(*i);//*运算符返回迭代器所指的项;建立在指针操作基础上
 80         *i=(*i)*10;  81  }  82     QList<int> ::const_iterator ci;  83     for(ci=list.constBegin();ci!=list.constEnd();++ci)//++ci 可以直接转到下一个列表项
 84         QDebug()<<*ci;  85     return 0;  86 }  87 //2.22 QMap类和QHash类  88 //QHash 更快,任意顺序储存数据项,而QMap按照键的顺序储存数据
 89 #include <QCoreApplication>
 90 #include <QDebug>
 91 int main(int argc, char *argv[])  92 {  93  QCoreApplication a(argc, argv);  94     QMap<QString,QString> map;  95     map.insert("beijing","111");  96     map.insert("shanghai","021");  97     map.insert("nanjing","025");  98     QMapIterator<QString,QString> i(map);//创建一个只读迭代器
 99     for(;i.hasNext();) 100  { 101         qDebug()<<" "<<i.key()<<" "<<i.next().value();//注意,输入键与值时调用的函数不一样;输出键的时候,不需要使迭代点移动到下一个位置
102  } 103     QMutableMapIterator<QString,QString> mi(map); 104     if(mi.findNext("111")) 105         mi.setValue("Has been changed"); 106     QMapIterator<QString,QString> modi(map); 107     qDebug()<<" "; 108     for(;modi.hasNext();) 109         qDebug()<<" "<<modi.key()<<" "<<modi.next().value(); 110     return a.exec(); 111 } 112 //STL风格迭代器遍历容器见P37