今天就搞一搞QT中的容器。
首先,我不是分享每个容器是怎样工作的,只是分享一下在实际开发过程中遇到的问题。
场景:
从服务器拿到了json数组,其中name和number是我们想要保存的,所以第一印象就是使用QMap了,以key-value的形式存储。
一切都很完美:
QMap
QMap<QString, QString> map;
map.insert("beijing", "111");
map.insert("shanghai", "021");
map.insert("tianjin", "022");
map.insert("chongqing", "023");
map.insert("jinan", "0531");
map.insert("wuhan", "027");
QMap<QString, QString>::const_iterator i;
for( i=map.constBegin(); i!=map.constEnd(); ++i)
{
qDebug() <<i.key() <<" " <<i.value();
}
一切都很完美,但是发现与服务器端的顺序是不一样的。
输出:
"beijing" "111"
"chongqing" "023"
"jinan" "0531"
"shanghai" "021"
"tianjin" "022"
"wuhan" "027"
这里不需要大惊小怪,在C++ STL MAP中就知道了 map是按key进行排序的,以便提高效率。
所以我们不需要排序,于是,我们使用QHash替代QMap。
QHash
QHash<QString, QString> hash;
hash.insert("beijing", "111");
hash.insert("shanghai", "021");
hash.insert("tianjin", "022");
hash.insert("chongqing", "023");
hash.insert("jinan", "0531");
hash.insert("wuhan", "027");
for (auto it = hash.begin(); it != hash.end(); it++)
{
qDebug() << it.key() << " " <<it.value();
}
输出:
"wuhan" "027"
"jinan" "0531"
"shanghai" "021"
"tianjin" "022"
"chongqing" "023"
"beijing" "111"
再运行一次输出:
"chongqing" "023"
"jinan" "0531"
"beijing" "111"
"shanghai" "021"
"wuhan" "027"
"tianjin" "022"
看到了吧,每次输出是随机的,问题就是出在我们遍历qhash哈希的时候,迭代器是随机的。
这个时候QMap,QHash都没有达到我们的目的,这个时候可以使用QList了。
QList和QPair
这两个配合很好用:
QList<QPair<QString, QString>> list;
list.append(qMakePair("beijing", "111"));
list.append(qMakePair("shanghai", "021"));
list.append(qMakePair("tianjin", "022"));
list.append(qMakePair("chongqing", "023"));
list.append(qMakePair("jinan", "0531"));
list.append(qMakePair("wuhan", "027"));
for(int i = 0; i < list.size(); i++)
{
qDebug() << list.at(i).first << " " << list.at(i).second;
}
等等,什么情况,居然报错!!!!!
error: array used as initializer
于是进行修改:
QList<QPair<QString, QString>> list;
list.append(qMakePair(QString("beijing"), QString("111")));
list.append(qMakePair(QString("shanghai"), QString("021")));
list.append(qMakePair(QString("tianjin"), QString("022")));
list.append(qMakePair(QString("chongqing"), QString("023")));
list.append(qMakePair(QString("jinan"), QString("0531")));
list.append(qMakePair(QString("wuhan"), QString("027")));
for(int i = 0; i < list.size(); i++)
{
qDebug() << list.at(i).first << " " << list.at(i).second;
}
运行结果:
"beijing" "111"
"shanghai" "021"
"tianjin" "022"
"chongqing" "023"
"jinan" "0531"
"wuhan" "027"
达到目的,完美!