【问题标题】:Sort actual QMap by key按键排序实际 QMap
【发布时间】:2014-10-31 17:47:42
【问题描述】:

我有QMap<QString, MyClass*>。我需要使用自然比较按键对其进行排序。 我愿意:

std::map<QString, MyClass*> map = c.toStdMap();
std::sort(map.begin(), map.end(), strnatcmp1<std::pair<QString, MyClass*>>);

但是,这甚至无法编译。即使它这样做了,据我所知,它也会对我原来的QMap副本进行排序。

有没有办法通过提供的比较键功能对我的QMap进行按键排序?

【问题讨论】:

  • 你为什么要这样做?! QMap 是一棵红黑树,它已经按键排序了。
  • 如果键是QString,它是按词法排序的(1 10 11 2 3 4),但我需要自然比较(1 2 3 4 10 11)。
  • 那么,为什么不使用int作为key呢?
  • 因为 QString 已经在项目中到处使用了。这个软件不是我写的

标签: c++ qt sorting qtcore qmap


【解决方案1】:

您可以采取几种方法:

main.cpp

#include <QMap>
#include <QDebug>
#include <map>


struct str_num_compare {
  bool operator() (const QString& lhs, const QString& rhs) const
  {return lhs.toInt()<rhs.toInt();}
};

int main()
{
    QStringList stringList{"1", "10", "11", "2", "3", "4"};

    QMap<int, QString> map;
    foreach (const QString &string, stringList)
        map.insert(string.toInt(), string);
    qDebug() << "Integer key approach:" << map;

    std::map<QString, QString, str_num_compare> std_map;
    foreach (const QString &string, stringList)
        std_map[string] = string;
    qDebug() << "QString key approach with std::map:";
    for (auto item : std_map)
        qDebug() << item.first;


    return 0;
}

main.pro

TEMPLATE = app
TARGET = main
QT = core
CONFIG += c++11
SOURCES += main.cpp

构建并运行

qmake && make && ./main

输出

Integer key approach: QMap((1, "1")(2, "2")(3, "3")(4, "4")(10, "10")(11, "11"))
QString key approach:
"1"
"2"
"3"
"4"
"10"
"11"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-17
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 2019-01-30
    • 2011-08-16
    相关资源
    最近更新 更多