Qt总结之九:QMap中嵌套QList

本文深入探讨了QMap和QList在Qt中的应用,包括如何使用迭代器遍历容器,QMap中嵌套QList实现一维、二维数组及类数据库的功能,以及通过实例展示数据操作技巧。

前言

QMap和QList都支持 QList<T>::iterator 迭代器

一、初识 

#include <QtCore/QCoreApplication>
 
//
#include <QList>
#include <QMap>
#include <QDebug>
#include <iostream>
#include <QTextCodec>
 
//
int main(int argc, char *argv[])
{
	QCoreApplication a(argc, argv);
	QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
 
	//QList容器测试
	qDebug() << QObject::tr("QList容器测试");	
	QList<int> list;
	for (int i = 0; i < 10; i++)
	{
		list.insert(list.end(), i);
	}
 
	QList<int>::iterator j;
	for (j = list.begin(); j!=list.end(); ++j)
	{
		qDebug() << (*j);
		*j = (*j) * 10;
	}
 
	QList<int>::const_iterator cj;
	for (cj = list.begin(); cj!=list.end(); ++cj)
	{
		qDebug() << (*cj);
	}
	
	
	//QMap容器测试
	qDebug() << QObject::tr("QMap容器测试");
	QMap<QString, QString> map;
	map.insert("beijing", "111");
	map.insert("shanghai", "021");
	map.insert("tianjin", "022");
 
	QMap<QString, QString>::const_iterator ck;
	for(ck = map.constBegin(); ck!=map.constEnd(); ck++)
	{
		qDebug() << ck.key() << " " << ck.value();
	}
 
	QMap<QString, QString>::iterator mk;
	mk = map.find("beijing");
	if (mk != map.end())
	{
		mk.value() = "010";
	}
	
	qDebug() << "";
 
	QMap<QString, QString>::const_iterator nck;
	for(nck = map.constBegin(); nck!=map.constEnd(); nck++)
	{
		qDebug() << nck.key() << " " << nck.value();
	}
 
	return a.exec();
}

二、QMap中嵌套QList

(1)一维数组

刚接触QT的QMap比较困惑,看这名字以为是二维数组

因为我把QList当作一维数组来用了,事实上也确实可以,但只当一维数组太浪费了。可参考别的资料


 
QMap<QString, QList<QString> > panelStatistics;
    QList<QString> panelInfo;
    panelInfo.push_back("0102");
    panelInfo.push_back("1253");
    panelInfo.push_back("1256");
    panelStatistics.insert("面板1", panelInfo);
 
    QMap<QString, QList<QString> >::iterator it;
    for(it = panelStatistics.begin(); it != panelStatistics.end(); ++it)
    {
            QList<QString> tmp = it.value();
            qDebug()<<it.key() <<" "<< tmp[0] <<" "<< tmp[1] <<" "<< tmp[2];
    }

(2)二位数组

//在初始化的时候这样
QMap<int, QList<Qstring> > tableDate;
QList<Qstring> tmp;
for(int i = 0; i < 10; i ++)
{
	tmp.clear();
	tmp.push_back("monday in row"   + QString::number(i));
	tmp.push_back("tuesday in row"  + QString::number(i));
	tmp.push_back("wensday in row"  + QString::number(i));
	tmp.push_back("thursday in row" + QString::number(i));
	tmp.push_back("friday in row"   + QString::number(i));
	tmp.push_back("sateday in row"  + QString::number(i));
	tmp.push_back("sunday in row"   + QString::number(i));
	tableDate.insert(i, tmp);
}
//取值可以这样
QList<Qstring> result;
result = tableDate.value(3);
for(int i = 0; i < reslut.length; i ++)
{
	qDebug() << result[i] + " ";
}

(3)类数据库

 

QMapIterator<int, QList<QString> > iter(tableDate);
QList<QString> whatDate;
while(iter.hasNext())
{
	iter.next();
	if(whatDate = iter.value())
	{
		qDebug() << whatDate[0];
		qDebug() << whatDate[1];
		qDebug() << whatDate[2];
		qDebug() << whatDate[3];
	}
}

 

### 三级标题:QMap 中使用 QList 的方法及示例 `QMap` 是 Qt 提供的键值对容器类,支持按键排序存储数据。当需要将 `QList` 作为值类型嵌套使用时,可以形成类似 `QMap<Key, QList<Value>>` 的结构,这种嵌套方式非常适合存储与某个键相关联的多个数据项。 #### 声明和初始化嵌套结构 可以声明一个 `QMap`,其值为 `QList` 类型,例如: ```cpp QMap<QString, QList<int>> map; ``` 此声明定义了一个外层 `QMap`,其键为 `QString` 类型,值为 `QList<int>` 类型。 #### 插入数据 可以通过 `operator[]` 或 `insert` 方法插入数据。以下是一个插入数据的示例: ```cpp map["Numbers"] << 1 << 2 << 3; map["EvenNumbers"] << 2 << 4 << 6; ``` 上述代码将键 `"Numbers"` 对应的值设置为一个包含 1、2、3 的 `QList<int>`,键 `"EvenNumbers"` 对应的值设置为包含 2、4、6 的 `QList<int>`。 #### 遍历嵌套结构 可以使用迭代器或范围循环遍历嵌套的 `QMap`。以下是使用范围循环的示例: ```cpp for (const QString& key : map.keys()) { QList<int> list = map[key]; qDebug() << key << ":"; for (int value : list) { qDebug() << " " << value; } } ``` 该代码将输出所有嵌套的数据,格式为 `"Key:",并列出每个键对应的 `QList` 中的值。 #### 清理嵌套结构中的数据 当 `QList` 中存储的是指针类型时,需要手动清理内存。例如,清理 `QMap<int, QList<MyClass*>>` 的代码如下: ```cpp QMap<int, QList<MyClass*>> myMap; // 遍历 QMap 的所有元素 for (QMap<int, QList<MyClass*>>::iterator it = myMap.begin(); it != myMap.end(); ++it) { QList<MyClass*> list = it.value(); // 遍历 QList 的所有元素并删除指针 for (MyClass* obj : list) { delete obj; } // 清空 QList list.clear(); } // 清空 QMap myMap.clear(); ``` 该代码确保所有动态分配的 `MyClass` 对象都被正确删除,避免内存泄漏。 #### 适用场景 `QMap` 中嵌套 `QList` 的结构在以下场景中非常有用: - **存储多个相关值**:例如,一个键可能需要对应多个值,如用户的多个订单或多个联系方式。 - **实现多级索引**:例如,按年份和月份组织数据,每个年份对应多个月份,每个月份又对应多个数据项。 - **数据分类与分组**:例如,按类别组织数据,如上述示例中的数字和偶数分类。 这种嵌套结构提供了良好的数据组织能力,适用于需要将多个值与某个键关联的场景[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值