迭代器
QT支持两种类型的迭代器
只读迭代器:const_iterator
读写迭代器:iterator
只读迭代器比读写迭代器操作速度快很多
一、QList
概念:是一个提供列表的模板类
//函数: insert(); //指定索引处插入值 replace(); //指定索引处替换值 append(); //尾追 prepend(); //头追 at(): //得到索引索引的值 count(); //返回某元素的个数 contains();//判断是否包含某元素。返回值:布尔值 swap(); //交换两个索引对应的值,参数:1.索引1 2.索引2 indexOf(); //得到参数1对应元素的索引,参数2:从哪里开始查找(可缺省) removeAt(); //移除索引处值 removeFirst();//移除第一个元素 removeLat(); //移除最后一个元素 removeAll(); //移除参数中对应的元素(删除全部) remove(); //移动元素。参数:1.起始索引 2.目标索引处 //将元素从起始索引移到目标索引处,其它元素跟着相应变化(向前或前后) takeAt(); //移除索引对应的元素并得到这个元素 takeFirst(); takeLast();
①常见操作
可以通过<<添加元素
QList<int> list; list<<1<<2<<3<<4<<5;
②遍历元素
使用for、foreach、迭代器
QList<int> list; QList<int>::const_iterator ite; //定义一个只读迭代器 list<<1<<2<<3<<4<<5; for(ite=list.begin();ite!=list.end();++ite) { qDebug()<<(*ite); } foreach (int item, list) { qDebug()<<item; } for(int i=0;i<list.size();++i) { qDebug()<<list.at(i); }
二、QLinkedList
概念:是一个提供链接列表的模板类
三、QVector
概念:是一个提供动态数组的模板类
四、QMap
概念:提供了一个基于跳跃列表的字典
//函数: insert(); //插入元素(推荐使用)。参数:1.key 2.value value(); //通过Key值v获得value,不存在返回0 take(); //删除一个key,并获得这个key对应的值 clear(); //清除所有元素 contains(); //判断对应的key值是否存在,返回:布尔值
1. 常见操作
使用[]去取一个key对应的值时,如果这个key不存在,则返回0、NULL...等(依据类型而定),并添加这个key值
QMap<QString,int> map; map["one"] = 1; int value1 = map["two"]; qDebug()<< value1; //返回0,two已经添加进map中
2. 遍历元素
通过迭代器、foreach
QMap<QString,int> map; QMap<QString,int>::const_iterator ite; map.insert("one",1); map.insert("two",2); for(ite=map.constBegin();ite!=map.constEnd();++ite) { qDebug()<<ite.key()<<ite.value(); } foreach (QString item, map.keys()) //通过遍历keys列表 { qDebug()<<item<<map[item]; }
3. 查找
if(myQMap.contains("my key")){ myValue = myQMap["my key"]; }
auto it = myQMap.find("my key"); if(it != myQMap.end()){ myValue = it.value(); }
4. 演示代码
基本应用演示
下面以“键-值”都是QString的例子说明QMap的基本使用方法。
#include <qmap.h> #include <iostream> using namespace std; class MapTest { public: void showMap() { if (!m_map.isEmpty()) return; //判断map是否为空 m_map.insert("111", "aaa"); //向map里添加一对“键-值” if (!m_map.contains("222")) //判断map里是否已经包含某“键-值” m_map.insert("222", "bbb"); m_map["333"] = "ccc"; //另一种添加的方式 qDebug() << "map[333],value is:" << m_map["333"]; //这种方式既可以用于添加,也可以用于获取,但是你必须知道它确实存在 if (m_map.contains("111")){ QMap<QString, QString>::iterator it = m_map.find("111"); //找到特定的“键-值”对 qDebug() << "find 111 , value is : " << it.value(); //获取map里对应的值 } cout << endl; qDebug() <<"size of this map is :" << m_map.count(); //获取map包含的总数 cout << endl; QMap<QString, QString>::iterator it; //遍历map for (it = m_map.begin(); it != m_map.end(); ++it) { qDebug() << it.key()<< "," << it.value(); //用key()和data()分别获取“键”和“值” } } m_map.clear(); //清空map } private: QMap<QString,QString> m_map; //定义一个QMap对象 };
调用类函数showMap(),显示结果:
map[333] , value is : ccc find 111 , value is : aaa size of this map is : 3 111: aaa 222: bbb 333: ccc
对象的使用
map当中还可以保存类对象、自己定义类对象,例子如下(摘自QT帮助文档《Qt Assistant》,更详细的说明参考之):
以注释形式说明
#include <qstring.h> #include <qmap.h> #include <qstring.h> //自定义一个Employee类,包含fn、sn、sal属性 class Employee { public: Employee(): sn(0) {} Employee( const QString& forename, const QString& surname, int salary ) : fn(forename), sn(surname), sal(salary) { } QString forename() const { return fn; } QString surname() const { return sn; } int salary() const { return sal; } void setSalary( int salary ) { sal = salary; } private: QString fn; QString sn; int sal; }; int main(int argc, char **argv) { QApplication app( argc, argv ); typedef QMap<QString, Employee> EmployeeMap; //自定义一个map类型,值为EmployeeMap对象 EmployeeMap map; map["JD001"] = Employee("John", "Doe", 50000); //向map里插入键-值 map["JW002"] = Employee("Jane", "Williams", 80000); map["TJ001"] = Employee("Tom", "Jones", 60000); Employee sasha( "Sasha", "Hind", 50000 ); map["SH001"] = sasha; sasha.setSalary( 40000 ); //修改map值的内容,因为map采用值传递,所以无效 //批量打印 EmployeeMap::Iterator it; for ( it = map.begin(); it != map.end(); ++it ) { printf( "%s: %s, %s earns %d\n", it.key().latin1(), it.data().surname().latin1(), it.data().forename().latin1(), it.data().salary() ); } return 0; }
Program output: JD001: Doe, John earns 50000 JW002: Williams, Jane earns 80000 SH001: Hind, Sasha earns 50000 TJ001: Jones, Tom earns 60000
5. 要注意的问题
(1)最近一个项目中使用了别人的接口程序,维护代码时发现定义的一个QMap对象总是无缘无故的多出数据,找遍程序也没发现哪里显式插入数据,后来发现原来是使用QMap::[key]操作符取value时,如果所传key在map里不存在的话,map会自动插入一条默认数据。。。这个悲催的问题浪费了我几个小时的时间。。特意写下来,提醒自己。
(2)查找的时候应该这么写:找到了再调用
if(map.contains("22222")){ qDebug() << map.find("22222").value(); }
五、QHash
概念:一个模板类,它提供基于哈希表的字典
QMap与QHash的差别:
QHash具有比QMap更快的查找速度
QHash以任意的顺序存储数据项,而QMap总是按照键Key顺序存储数据
六、容器常用算法
一、qSort
排序,默认为升序,第二个参数:qGreater<T>()逆序
QList<int> list; list << 36 << 16 << 66 << 6 << 56; qSort(list.begin(), list.end()); //升序 qSort(list.begin(), list.end(),qGreater<int>()); //逆序
二、qCopy
拷贝,要注意有足够的空间存储拷贝内容
QStringList list; list << "a" << "b" << "c"; QVector<QString> vect(5); qCopy(list.begin(), list.end(), vect.begin()+1); foreach (QString item, vect) { qDebug() << item; } //vect:["","a","b","c",""]
三、查找(qFind、find)
QList查找,qFinf
QList<int> List; List << 1 << 5 << 15 << 25; QList<int>::const_iterator Iter = qFind(List.begin(), List.end(), 25); if(Iter != List.end()) { qDebug() << "Find: " << *Iter; } else { qDebug() << "Not Find"; }
QMap查找,find只能找到其key值,而不是value值
QMap<int,QString> map; map.insert(1,"a"); map.insert(2,"b"); QMap<int,QString>::const_iterator Iter=map.find(1); while(Iter!=map.end()&&Iter.key()==1) { qDebug()<<Iter.key()<<Iter.value(); }
————————————————
版权声明:本文为CSDN博主「江南、董少」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41453285/article/details/83825316

