Qt 中的数据结构类(2)QList、QLinkedList、QVector、 QMap、QHash

迭代器

QT支持两种类型的迭代器

  • 只读迭代器:const_iterator

  • 读写迭代器:iterator

只读迭代器比读写迭代器操作速度快很多

image.png

一、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;

②遍历元素

使用forforeach迭代器

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

本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年3月    »
123
45678910
11121314151617
18192021222324
25262728293031
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864