结论:QMap的升序排序是指对key值的首字母的Ascii码顺序来确定的。
以下通过一个示例来看看QMap怎么排序的。
ASCII码表:
示例:
QMap<QString,QString> map;
QStringList list;
list<<"1"<<"2"<<"3"<<"11"<<"21"<<"!"<<"/"<<":"<<"A"<<"/A"<<"!:"<<"A1";
for (int i = 0; i < list.size(); ++i) {
map.insert(list[i],QString::number(i));
}
for (QMap<QString,QString>::const_iterator it = map.begin(); it != map.end(); it++) {
qDebug()<<it.key()<<it.value();
}
结果:
从插入规则和结果,对照ASCII码表不难看出map的排序都是按照key值首字母的顺序来排序的,
我们现在把list改成 :
list<<“1”<<“2”<<“3”<<“11”<<“21”<<“!”<<“/”<<“:”<<“A”<<“/A”<<“!:”<<“A1”<<“/1”<<“/:”;
结果:
可以看出多个字符的key值,首字母排序后,如果首字母相同,则从第二个字母按照ASCII顺序来排序。
通过以上规律当我们需要顺序排序时,就不要将key值的类型定义为QString、QByteArray等字符串类型,而需要定义为int型。
如下示例:
QMap<int,QString> map;
QList<int> list;
list<<1<<2<<3<<11<<21<<'!'<<'/'<<':';
for (int i = 0; i < list.size(); ++i) {
map.insert(list[i],QString::number(i));
}
for (QMap<int,QString>::const_iterator it = map.begin(); it != map.end(); it++) {
qDebug()<<it.key()<<it.value();
}
结果: