我有一个随机生成的整数列表并用这些值填充了一个 QMap 但我想让 QMap 按值排序
问问题
5880 次
3 回答
4
这是一个演示如何QMap <int, int>
在 qt C++ 中按值而不是按键对 a 进行排序。
QMap 的值被提取并存储在 QList 容器对象中,然后通过 qSort 方法进行排序。密钥也自己存储在 QList 中。排序完成后,QMap 对象被清空,键和值按值升序插入 QMap 容器中。请参阅下面的解决方案:
#include <QCoreApplication>
#include <qalgorithms.h>
#include <QMap>
#include <QDebug>
#include <QList>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QMap <int, int> dataMapList;
//QMap <int, int> sorted = new QMap<int, int>();
QList <int> keys; // container to store all keys from QMap container
QList<int> values; // container to store all values from QMap container
QMap<int, int>::Iterator h; // used to loop/ iterate through QMap
// used to iterate through QLists
QList<int>::Iterator i; //
QList<int>::Iterator j;
//inserts to QMap Container
dataMapList.insert(1,34);
dataMapList.insert(3,2);
dataMapList.insert(2,32);
dataMapList.insert(14,89);
dataMapList.insert(7,23);
h=dataMapList.begin();
qDebug()<< "unsorted";
//list out the unsorted values along with their respective keys
while(h!=dataMapList.end()){
qDebug() << "[" << h.key()<<"], " <<"[" <<h.value()<<"]" << endl;
h++;
}
values = dataMapList.values(); // pass all values in the QMap to a QList container to store values only
keys= dataMapList.keys(); // pass all keys in the QMap to a QList container to store already sorted by default keys
qSort(values); // sorts the values in ascending order
dataMapList.clear(); // empties the QMap
i=values.begin();
j=keys.begin();
// insert back the sorted values and map them to keys in QMap container
while(i!=values.end() && j!=keys.end()){
dataMapList.insert(*j, *i);
i++;
j++;
}
qDebug() << "sorted" << endl;
h=dataMapList.begin();
//the display of the sorted QMap
while(h!=dataMapList.end()){
qDebug() << "[" << h.key()<<"], " <<"[" <<h.value()<<"]" << endl;
h++;
}
return a.exec();
}
注意:QMap 和 QList 的迭代器用于遍历容器以访问存储的值和/或键。这些也有助于显示列表中的项目(未排序和排序)。该解决方案是在 Qt 控制台应用程序中完成的。
于 2012-11-20T06:45:20.070 回答
3
默认情况QMap
下,项目总是按键排序。所以,如果你像这样迭代QMap
:
QMap<int, int>::const_iterator i = yourQMap.constBegin();
while (i != yourQMap.constEnd()) {
cout << i.key() << ": " << i.value() << endl;
++i;
}
你会得到按键排序的结果。
试着考虑改变你的任务以适应标准算法。否则,您可以使用此方法对标题进行排序:
QList<int> list = yourQMap.values();
qSort(list.begin(), list.end());
然后,如果您需要 - 通过调用 method 获取关联的键QMap::key(const T &value);
。
于 2012-11-20T00:07:03.710 回答
2
根据具体情况,另一种选择是简单地交换键和值,因为键将自动按QMap
. 在大多数情况下,这些值不会是唯一的,因此只需使用 aQMultiMap
代替。
例如,假设我们在 QMap 中有以下数据:
Key Value
--- -----
1 100
2 87
3 430
4 87
以下代码将按值对数据进行排序。
QMap<int, int> oldMap;
QMultiMap<int, int> newMap;
QMapIterator<int, int> it(oldMap);
while (it.hasNext())
{
it.next();
newMap.insertMulti(it.value(), it.key()); //swap value and key
}
我们的新地图现在看起来像这样:
Key Value
--- -----
87 4
87 2
100 1
430 3
于 2014-03-12T21:45:42.050 回答