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