本文主要是对容器 和迭代器的学习 废话很少 都是在点上 更多的是代码示列
若有不对的地方希望大家批评指正
程序中使用的类
#include <QCoreApplication> #include <QList> #include <QDebug> #include <QListIterator> #include <QMutableListIterator> #include <QMapIterator> #include <QMutableMapIterator>存储键值对
QMapQMultiMap 一键多值QHashQMutiHashQSetQCache 对缓存存储中对象的高效散列查找QContiguousCache操作函数
insert() << 插入 replace() 替换 removeAt() 移除 move() 移动 swap() 交换 append() 添加到表尾 prepend() 添加到表头 removeFirst() 移除第一项 removeLast() 移除最后一项 takeAt() takeFirst() takeLast() 获取此项并删除 indexOf() 获取索引 contains() 匹配相同项 count() 某项出现的次数 at 比 [] 索引快 /* QList */ QList <QString> list; list<<"aa"<<"bb"<<"cc"; //插入项目 if(list[1]=="bb") list[1]="ab"; list.replace(2,"bc"); //"cc"替换为 "bc" qDebug()<<"the list is:"; for(int i=0;i<list.size();++i) //输出整个list { qDebug()<<list.at(i); } list.append("dd"); //添加到尾部 list.prepend("hh"); //添加到头部 QString str=list.takeAt(2); //获取第3项 并删除 qDebug()<<"at(2) item is :"<<str; qDebug()<<"the list is:"; for(int i = 0;i<list.size();++i) { qDebug()<<list.at(i); } list.insert(2,"mm"); //在位置2插入数据 "mm" list.swap(1,3); //交换项目1和项目3 list.append("mm"); qDebug()<<"the list is:"; for(int i=0;i<list.size();++i) { qDebug()<<list.at(i); } qDebug()<<"contains 'mm'?"<<list.contains("mm"); //list中是否包含"mm" qDebug()<<"the 'mm' count:"<<list.count("mm"); //包含"mm"个数 //默认返回匹配到的第一个的位置 qDebug()<<"the first 'mm' index:"<<list.indexOf("mm"); //从之指定位置(3)开始查找 qDebug()<<"the second 'mm' index:"<<list.indexOf("mm",3);操作函数
insert() 插入 value() 获取值 不存在是默认返回0 可以设定返回的值 [] 获取一个值 不存在时 插入 contains() 匹配是否有相同 remove() 移除一个键 take() 获取该键值并移除该键 clear() 清空 insertMulti() 插入一键多值 /*QMap */ QMap<QString,int>map; //插入 map["one"] = 1; map["three"] = 3; map.insert("seven",7); qDebug()<<map; //获取键的值 qDebug()<<"valuel:"<<map["six"]; //使用"[]" 没有键值时 会自动插入 qDebug()<<"contains 'six' ?"<<map.contains("six"); qDebug()<<map; //使用value()函数获取键值 不存在时不会自动插入 qDebug()<<map.value("five"); qDebug()<<"contains 'five' ?"<<map.contains("five"); //当键不存在时 value()默认返回0,可以设定该值 如设为9 qDebug()<<"nine:"<<map.value("nine",9); //map默认键对应一个值 可以重新设置 以前的会被覆盖 map.insert("ten",10); map.insert("ten",100); qDebug()<<"ten:"<<map.value("ten"); //使用insertMuti()函数实现一键多值 用values()来获取值的列表 map.insertMulti("two",2); map.insertMulti("two",20); //这样可以打印出源数据 qDebug()<<"two:"<<map.values("two"); //打印出每一项 QList <int>values =map.values("two"); for(int i=0;i<values.size();++i) { qDebug()<<values.at(i); } //使用QMultiMap 实现一键多值 QMultiMap <QString,int>map1,map2,map3; map1.insert("values",1); map1.insert("values",2); map2.insert("values",3); //可以进行相加操作 map3=map1+map2; qDebug()<<map3.values(); //打印map3中的每一项 QList <int> myvalues = map3.values("values"); for(int i=0; i<myvalues.size();++i) { qDebug()<<myvalues.at(i); }容器可以嵌套使用 QMap<QString, QList<int> > "> >"之间必须有一个空格 否则编译器会将其当作“>>”
值的类型可以是任何可赋值的数据类型(有一个默认的构造函数,一个复制构造函数,一个赋值操作运算符)像基本的类型(int,double) 、指针型、Qt的数据类型(QString QDate等) 但不包括 QObject 及其子类(QWidget、QDialog、QTimer等),但可以存储这些类的指针 QList<QWidget*>
其API模仿数组指针 通过“++”x向后移动 “*”指向迭代器返回的项 begin()指向第一个项目 end()指向最后一个项目的下一个虚项目 (end()标志着一个无效位置)"++"作为前缀时 会先修改迭代器后返回迭代器的一个引用 作为后缀时 修改前会进行复制 后返回这个复制 若不对返回值做处理的话 用前缀(++i)更快 //STL风格迭代器 /*QList*/ QList<QString>list; list<<"A"<<"B"<<"C"<<"D"; QList<QString>::iterator i; //使用读写迭代器 qDebug()<<"the forward is :"; for(i = list.begin();i!=list.end();++i) { *i=(*i).toLower(); //QString 的toLower()函数转换为小写 qDebug()<<*i; } qDebug()<<"the backward is:"; while (i !=list.begin()) { --i; qDebug()<<*i; } QList<QString>::const_iterator j; //使用只读Iterator qDebug()<<"the forward is:"; for(j=list.constBegin();j!=list.constEnd();++j) { qDebug()<<*j; } //QMap QMap<QString,int>map; map.insert("one",1); map.insert("two",2); map.insert("three",3); QMap<QString,int>::const_iterator p; qDebug()<<"the forward is :"; for(p = map.constBegin();p!=map.constEnd();++p) { qDebug()<<p.key()<<":"<<p.value(); }