可能因为某个具体的需求,需要对QQueue容器内的数据进行反向遍历,即从尾到头进行遍历。因对数据结构各种容器模板没有过多的见解,遂不献丑,相关问题不明白的自行查看相关文档或者百度。
下面是我写的一个小栗子:
1.首先构建一个类:它的作用很简单就是保存几个设备的相关数据;
devicedata.h
#ifndef DEVICEDATA_H
#define DEVICEDATA_H
#include <QObject>
#include <QDateTime>
class DeviceData : public QObject
{
Q_OBJECT
public:
explicit DeviceData(QString id,QString tag,QString data,QObject *parent = 0);
explicit DeviceData(QString id,QString data);
explicit DeviceData();
~DeviceData();
QString ID() const;
void setID(const QString &ID);
QString Data() const;
void setData(const QString &Data);
QObject *Obj() const;
void setObj(QObject *Obj);
QString Tag() const;
void setTag(const QString &Tag);
signals:
private:
QString m_ID;
QString m_Tag;
QString m_Data;
QObject *m_Obj;
public slots:
};
#endif // DEVICEDATA_H
实现文件:
#include "devicedata.h"
DeviceData::DeviceData(QString id, QString tag, QString data, QObject *parent) : QObject(parent)
{
m_ID = id;
m_Tag = tag;
m_Data = data;
}
DeviceData::DeviceData(QString id, QString data)
{
m_ID = id;
m_Data = data;
}
DeviceData::DeviceData()
{
}
DeviceData::~DeviceData()
{
}
QString DeviceData::ID() const
{
return m_ID;
}
void DeviceData::setID(const QString &ID)
{
m_ID = ID;
}
QString DeviceData::Data() const
{
return m_Data;
}
void DeviceData::setData(const QString &Data)
{
m_Data = Data;
}
QObject *DeviceData::Obj() const
{
return m_Obj;
}
void DeviceData::setObj(QObject *Obj)
{
m_Obj = Obj;
}
QString DeviceData::Tag() const
{
return m_Tag;
}
void DeviceData::setTag(const QString &Tag)
{
m_Tag = Tag;
}
然后在main.cpp中写一个反向迭代的函数,具体代码:
#include <QCoreApplication>
#include <QQueue>
#include "devicedata.h"
#include <QDebug>
#include <QListIterator>
QString strData = "";
void iteratorData(QQueue<DeviceData*> deviceData,QString tag,QString ID)
{
//QQueue继承自QList,所以直接使用QList的迭代器了。
QListIterator<DeviceData*> itor(deviceData);
itor.toBack();//从尾部开始遍历
while(itor.hasPrevious())
{
if(itor.previous()->Tag() == tag)
{
itor.next();
if(itor.previous()->ID() == ID)
{
//每调用一次previous()方法移动一次位置
//所以把位置移回来
itor.next();
qDebug() << itor.previous()->Data();
itor.next();
strData = itor.previous()->Data();
break;//找到一个即停止
//如果需要查找全部符合的数据,将break;一行去掉即可
}
}
}
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QQueue<DeviceData*> deviceData;
//往容器里加入20个数据
deviceData.append(new DeviceData("2001","0A","32.12"));//A-1
deviceData.append(new DeviceData("2004","0B","12.68"));//B-1
deviceData.append(new DeviceData("2003","0B","14.62"));//B-2
deviceData.append(new DeviceData("2003","0A","62.62"));//A-2
deviceData.append(new DeviceData("2007","0A","37.22"));//A-3
deviceData.append(new DeviceData("2006","0B","62.27"));//B-3
deviceData.append(new DeviceData("2002","0B","55.14"));//B-4
deviceData.append(new DeviceData("2006","0A","42.22"));//A-4
deviceData.append(new DeviceData("2004","0A","83.92"));//A-5
deviceData.append(new DeviceData("2003","0B","34.11"));//B-5
deviceData.append(new DeviceData("2005","0A","76.14"));//A-6
deviceData.append(new DeviceData("2001","0A","12.23"));//A-7
deviceData.append(new DeviceData("2001","0B","32.23"));//B-6
deviceData.append(new DeviceData("2002","0A","42.61"));
deviceData.append(new DeviceData("2003","0B","92.11"));//B-7
deviceData.append(new DeviceData("2002","0A","22.62"));
deviceData.append(new DeviceData("2002","0B","35.41"));
deviceData.append(new DeviceData("2005","0B","12.59"));
deviceData.append(new DeviceData("2002","0A","45.02"));
deviceData.append(new DeviceData("2007","0B","42.63"));
qDebug() << "size:" << deviceData.size();
//从尾至头查找Tag = 0A ID = 2001的一个数据;
iteratorData(deviceData,"0A","2001");
qDebug() << "strData:" << strData;
qDebug() << "--------------------------------------";
//同理
iteratorData(deviceData,"0A","2007");
qDebug() << "strData:" << strData;
qDebug() << "--------------------------------------";
return a.exec();
}
测试结果:
如有何意见,请多多指教.