【问题标题】:Qt - QMap with custom class as keyQt - 以自定义类为键的 QMap
【发布时间】:2020-10-02 14:15:29
【问题描述】:

我有一个带有自定义类作为键的 QMap,但是当我尝试插入具有不同键的元素时,有时地图会替换另一个元素。 就我而言,问题是这样的:

#include <QCoreApplication>
#include <QMap>
#include <QDebug>

class A
{
  public:
    A(int value, const QString& string) { m_value = value; m_string = string; }

    bool operator<(const A& other) const { return m_value < other.m_value && m_string < other.m_string; }

  private:
    int m_value;
    QString m_string;
};

int main(int argc, char *argv[])
{
  QCoreApplication a(argc, argv);

  QMap<A, QString> map;

  map.insert(A(10, "ONE"), "FIRST");
  map.insert(A(10, "TWO"), "SECOND");
  map.insert(A(20, "THREE"), "THIRD");

  return 0;
}

如果您运行此代码,您会注意到“FIRST”元素和“SECOND”被混淆了。 地图结果是这样的:

我做错了吗?

【问题讨论】:

  • 您是否尝试向您的班级添加赋值运算符?
  • 我尝试添加赋值和相等运算符,但 QMap 使用运算符

标签: qt qmap


【解决方案1】:

您对operator&lt; 的定义有误。如果条件为假,它实际上会在第一个条件下短路,而第二个条件无关紧要。 对此要非常小心,它被认为是 UB 向容器提供了错误的实现。

但在您的情况下,只有键有问题。根据您的代码,A(10, "ONE")A(10, "TWO") 是同一个键。所以一切都按照以下方式进行:

map.insert(A(10, "ONE"), "FIRST");    // insert first element
map.insert(A(10, "TWO"), "SECOND");   // put value `SECOND` in the found key
map.insert(A(20, "THREE"), "THIRD");  // put second element

而且你的地图中的键混淆了,尺寸错误。

试试这个:

bool operator<(const A& other) const {
    if (m_value < other.m_value) return true;
    return m_string < other.m_string;
}

【讨论】:

  • 你说得对,我应该用 ||而不是 && in operator
  • 不,这仍然是错误的。我发现比较结构的一个好方法是添加一个从结构中创建 std::tuple 的方法,然后比较元组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 2013-07-03
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多