【问题标题】:QMap contains return always trueQMap 包含返回始终为真
【发布时间】:2014-08-07 06:33:09
【问题描述】:

我有这个 IdTask 类的代码

class IdTask
{
public:
IdTask(QString host, QString id) : _host(host), _id(id) {}
IdTask(const IdTask & idT) : _host(idT._host), _id(idT._id) {}

QString host() const { return _host;}
QString id() const { return _id;}

inline bool operator ==(const IdTask& idT) const { return _host == idT.host() && _id == idT.id();}
inline bool operator <(const IdTask& idT) const { return _host < idT.host() && _id < idT.id();}

private:
QString _host;
QString _id;
};

还有 IdResult 类

class IdResult
{
public:
IdResult(IdTask idT, QString id) : _idTask(idT), _id(id) {}
IdTask idTask() const { return _idTask;}
QString id() const { return _id;}
bool operator < (const IdResult& idR) const { return _idTask < idR.idTask() && _id < idR.id();}
private:
IdTask _idTask;
QString _id;
};

我创建了一个这样的 QMap:

QMap<IdResult, QString> mapIdResultInput;
mapIdResultInput.insert(IdResult(IdTask("localhost", "init"), "a"), "_a");

问题在于函数包含。

mapIdResultInput.contains(IdResult(IdTask("b", "c"), "g"));

它总是返回true。 我的代码有什么问题?

【问题讨论】:

  • 如果 QMapstd::map 类似(文档说它是红黑树),那么它需要一个 严格的弱排序 键,大概取自operator&lt;。你的不是严格的弱排序。您需要修复它才能使地图正常工作。
  • 为什么我的operator&lt; 不是严格的弱排序?
  • 例如{99, 2} &lt; {100, 1}{100, 1} &lt; {99, 2} 都是假的。这使得两者在您的订购中都等效。
  • 我对此表示怀疑。如果您需要排序,则哈希将不起作用。你可以实现基于主机和id的字典比较,但是你必须确保如果第一个主机

标签: c++ qt qmap


【解决方案1】:

我将通过以下方式解决此问题:我将首先按IdTask 对我的IdResults 进行排序,然后,如果IdTasks 相等,则按id 排序。这是我在类中对运算符的实现:

class IdTask
{
public:
    [..]
    bool operator ==(const IdTask& idT) const
    { return _host == idT.host() && _id == idT.id(); }

    bool operator <(const IdTask& idT) const 
    { return (_host < idT.host()) || (_host == idT.host() && _id < idT.id()); }
    [..]
};

class IdResult
{
    [..]
    bool operator < (const IdResult& idR) const 
    { return (_idTask < idR.idTask()) || (_idTask == idR.idTask() && _id < idR.id()); }
    [..]
};

还有测试

QMap<IdResult, QString> mapIdResultInput;
mapIdResultInput.insert(IdResult(IdTask("localhost", "init"), "a"), "_a");

bool b = mapIdResultInput.contains(IdResult(IdTask("b", "c"), "g")); // false
b = mapIdResultInput.contains(IdResult(IdTask("localhost", "init"), "a")); // true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    相关资源
    最近更新 更多