迭代器

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();

①常见操作

可以通过< list;

list<<1<<2<<3<<4<<5;

②遍历元素

使用for、foreach、迭代器QList list;

QList::const_iterator ite; //定义一个只读迭代器

list<<1<<2<<3<<4<<5;

for(ite=list.begin();ite!=list.end();++ite)

{

qDebug()<

}

foreach (int item, list)

{

qDebug()<

}

for(int i=0;i

{

qDebug()<

}

二、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 map;

map["one"] = 1;

int value1 = map["two"];

qDebug()<

2. 遍历元素

通过迭代器、foreachQMap map;

QMap::const_iterator ite;

map.insert("one",1);

map.insert("two",2);

for(ite=map.constBegin();ite!=map.constEnd();++ite)

{

qDebug()<

}

foreach (QString item, map.keys()) //通过遍历keys列表

{

qDebug()<

}

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

#include

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() <

if (m_map.contains("111")){

QMap::iterator it = m_map.find("111"); //找到特定的“键-值”对

qDebug() <

}

cout <

qDebug() <

cout <

QMap::iterator it; //遍历map

for (it = m_map.begin(); it != m_map.end(); ++it) {

qDebug() <

}

}

m_map.clear(); //清空map

}

private:

QMap 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

#include

#include

//自定义一个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 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() <

}

五、QHash

概念:一个模板类,它提供基于哈希表的字典

QMap与QHash的差别:

QHash具有比QMap更快的查找速度

QHash以任意的顺序存储数据项,而QMap总是按照键Key顺序存储数据

六、容器常用算法

一、qSort

排序,默认为升序,第二个参数:qGreater()逆序QList list;

list <

qSort(list.begin(), list.end());  //升序

qSort(list.begin(), list.end(),qGreater()); //逆序

二、qCopy

拷贝,要注意有足够的空间存储拷贝内容QStringList list;

list <

QVector vect(5);

qCopy(list.begin(), list.end(), vect.begin()+1);

foreach (QString item, vect)

{

qDebug() <

}

//vect:["","a","b","c",""]

三、查找(qFind、find)

QList查找,qFinfQList List;

List <

QList::const_iterator Iter = qFind(List.begin(), List.end(), 25);

if(Iter != List.end())

{

qDebug() <

}

else

{

qDebug() <

}

QMap查找,find只能找到其key值,而不是value值QMap map;

map.insert(1,"a");

map.insert(2,"b");

QMap::const_iterator Iter=map.find(1);

while(Iter!=map.end()&&Iter.key()==1)

{

qDebug()<

}

————————————————

版权声明:本文为CSDN博主「江南、董少」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

#转载请注明出处 www.skcircle.com 《少有人走的路》勇哥的工业自动化技术网站。如果需要本贴图片源码等资源,请向勇哥索取。

遍历qvector_Qt 中的数据结构类(2)QList、QLinkedList、QVector、 QMap、QHash相关推荐

  1. QList与QVector遍历方法与性能比较

    目录 一. 性能测试 二. QList与QVector耗时对比分析 三.QList遍历方式对比分析 四.QVector遍历方式对比分析 一. 性能测试 最近使用opengl画点云数据时发现比较卡顿,原 ...

  2. 遍历qvector_QT容器类(一) 之 QVector 、QLinkedList 和 QList | 学步园

    前言: Qt中提供了一系列的基于模板的容器类,这些类被用来存储指定类型的元素.例如,你需要一个可变长的QString的数组,你可以使用QVector, 相对于STL容器,Qt中这些容器类都是轻量级的, ...

  3. php类可以遍历,在PHP中检测一个类是否可以被foreach遍历

    在PHP中检测一个类是否可以被foreach遍历 在PHP中,我们可以非常简单的判断一个变量是什么类型,也可以非常方便的确定一个数组的长度从而决定这个数组是否可以遍历.那么类呢?我们要如何知道这个类是 ...

  4. 数据结构与算法之二叉树的先序遍历,中序遍历,后序遍历

    数据结构与算法之二叉树的先序遍历,中序遍历,后移遍历 目录 实现二叉树的先序,中序,后序遍历,包括递归方式和非递归方式 在二叉树中找到一个节点的后继节点 1. 实现二叉树的先序,中序,后序遍历,包括递 ...

  5. javascript数据结构与算法--二叉树遍历(中序)

    javascript数据结构与算法--二叉树遍历(中序) 中序遍历按照节点上的键值,以升序访问BST上的所有节点 代码如下: /**二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中*** ...

  6. 【数据结构笔记10】二叉树的先序、中序、后序遍历,中序遍历的堆栈/非递归遍历算法,层序遍历,确定一个二叉树,树的同构

    本次笔记内容: 3.3.1 先序中序后序遍历 3.3.2 中序非递归遍历 3.3.3 层序遍历 3.3.4 遍历应用例子 小白专场:题意理解及二叉树表示 小白专场:程序框架.建树及同构判别 文章目录 ...

  7. Java遍历包中所有类包括jar包(完整转载)

    第一部分转自 :http://blog.csdn.net/wangpeng047/article/details/8124390 第二部分转自:http://blog.csdn.net/wangpen ...

  8. Java遍历包中所有类

    由于项目需要,我想获得某包下所有的类(包括该包的所有子包),从网上找了找,没有什么能用的,即使找到了写的也不怎样,效率低下.索性就自己写吧,正好也锻炼锻炼写代码的功底.特此分享出来,希望能帮到大家.. ...

  9. Java遍历包中所有类-终续

    上一篇中,我向大家讲述了遍历jar包时所遇到的困难,本篇将向大家分享最终版代码. package com.itkt.mtravel.hotel.util;import java.io.File; im ...

最新文章

  1. 中国反渗透膜产业竞争现状与投资战略决策报告2021-2027年版
  2. 5.Spring Cloud Alibaba教程:Nacos整合Feign
  3. css a标签去掉下划线_这30个CSS选择器,你必须熟记(上)
  4. windows media player html5,Chrome安装Windows Media Player插件的方法
  5. 有了SDS,硬件还重要吗?
  6. css3鼠标悬停图片抖动效果
  7. sketch 将动图转换为json_UI设计师如何创建sketch设计样式、库和UI套件
  8. python支持向量机回归_支持向量机——核函数与支持向量回归(附Python代码)
  9. “空天地”一体化的遥感农业保险简介
  10. 正则表达式从基础开始
  11. 如何使用多种方法在 Mac 上截屏?
  12. ubuntu 下如何调节显卡风扇转速?
  13. 更聪明地学习,而不是苦读——《如何高效学习》
  14. 基于java的个人日程管理系统mysql
  15. 锤子官网html格式,锤子便签
  16. **图片元信息Exif**
  17. 工作中你应该知道的常识(深度好文)
  18. Mongodb访问控制
  19. Java JNA (三)—— 结构体使用及简单示例
  20. Fourier变换基础

热门文章

  1. 【Java】Comparable和Comparator接口
  2. kafka.errors.KafkaTimeoutError: KafkaTimeoutError
  3. 宝可梦综合耐久最大化计算器v1.2
  4. 网页视频流m3u8/ts视频下载(之ffmpeg)
  5. 百度云平台语音合成接口python调用
  6. 综述:3D目标检测多模态融合算法
  7. python处理两个Excel并且根据相同字段合并写入一个新的Excel
  8. 《直播疑难杂症排查》:播放卡顿
  9. Matlab中bitand函数
  10. OpenFOAM学习链接