自己在项目中遇到了qmap中key值需要用到结构体,对结构体里多个值进行匹配,全部成功输出才value值。
查阅大量资料,结果不尽人意,查询时总有些漏洞,不完全正确。
自己仔细研究qmap后发现,这个是一个顺序存储的容器。顾名思义,就是比较大小,小的排放在前,大的排放在后。插入与读取时,比较key值是按照2分查找法来进行的。不废话了。直接上图。
附带了一个qdbug输出的重写,请看官一起笑纳。
代码解析:我就不解析了,强调一点,QString类型用compare比较结果不是-1,0,1。只用比较0就行了。如果真的看不懂,就把注释打开,看看qdebug的输出,就明白qmap的存入和输出逻辑了。
测试代码也给你们安排上,自行领悟。
struct comkey{
QString comname;
int comgnm;
int zhanhao;
int addr;
bool operator<(const comkey&comdata2) const
{
if( this->comname.compare(comdata2.comname) <0 ||this->comname.compare(comdata2.comname) >0)
{
// qDebug()<<"this is comname:"<<comname;
// qDebug()<<"comdata2 is comname:"<<comdata2.comname;
return this->comname < comdata2.comname;//当小于成立,则插入
}else
{
if(this->comgnm < comdata2.comgnm || this->comgnm > comdata2.comgnm)
{
// qDebug()<<this->comname.compare(comdata2.comname);
// qDebug()<<"this is comgnm:"<<comname<<comgnm;
// qDebug()<<"comdata2 is comgnm:"<<comdata2.comname<<comdata2.comgnm;
return this->comgnm < comdata2.comgnm;
}else
{
if(this->addr < comdata2.addr || this->addr > comdata2.addr)
{
// qDebug()<<"this is addr:"<<comname<<addr;
// qDebug()<<"comdata2 is addr:"<<comdata2.comname<<comdata2.addr;
return this->addr < comdata2.addr;
}else
{
// qDebug()<<"this is zhanhao:"<<comname<<zhanhao;
// qDebug()<<"comdata2 is zhanhao:"<<comdata2.comname<<comdata2.zhanhao;
return this->zhanhao < comdata2.zhanhao;
}
}
}
}
friend QDebug& operator<<(QDebug out, const comkey& info)
{
out << "comname: "<<info.comname<< "comgnm: " << info.comgnm
<< "zhanhao: " << info.zhanhao << "addr: "<< info.addr;
return out;
}
};
for(int i =0;i<100;i++)//存100个进入map
{
comkey newkey;
newkey.comname = QString("thisis%1").arg(i);
newkey.comgnm = -i + 3;
newkey.addr = -i ;
newkey.zhanhao = -i -5;
comdata newdata;
//newdata.comname = QString("thisisis%1").arg(i);
newdata.linenum = i;
newdata.datatype = i +1;
newdata.num = i + 0.0123465;
newdata.moveaddr = i + 3;
qDebug()<<i<<"begin";
map.insert(newkey,newdata);
// qDebug()<<"查找:"<<map.value(newkey);
}
for (int i = 0;i < 100;i++)//输入key值,查询
{
comkey newkey;
newkey.comname = QString("thisis%1").arg(i);
newkey.comgnm = -i + 3;
newkey.addr = -i;
newkey.zhanhao = -i -5;
qDebug()<<"";
qDebug()<<map.value(newkey);
}
第一篇博客,别骑脸输出,谢谢。