【问题标题】:QMap doesn't insert when < operator compares two identical objects当 < 运算符比较两个相同的对象时,QMap 不插入
【发布时间】:2017-10-01 18:42:57
【问题描述】:

我正在努力学习 Qt。我遇到了一些问题,但通常我通过谷歌搜索找到解决方案。但是今天下午我遇到了 QMap 的问题,我不明白这个问题。

我创建了一个类 File 并覆盖了 operator&lt;,以便能够将其用作 QMap&lt;File, bool&gt; 中的键。问题是,当我尝试通过插入条目来初始化QMap 时,文件映射不包含operator&lt; 实现意义上的重复条目。

 bool File::operator<(const File &file) const{
   if(comparator == NAME){
     if(this->getFileName() != file.getFileName()){
        return this->getFileName() < file.getFileName();
     }
     return false;
   }
   return this->getFileHash() < file.getFileHash();
}

QMap初始化:

for(File file: files){
    //filesCheckStatus edclared in the header file QMap<File, bool> filesCheckStatus;
    filesCheckStatus.insert(file, false);
}

在此示例中,当使用比较器 NAME 时,仅插入一次具有相同名称 (QString) 的条目。

如果我在所有情况下都返回 false,则最终映射仅包含一个条目(插入的第一个条目)。

有人能解释一下这种行为吗?

【问题讨论】:

  • 这就是地图和集合的工作方式——一个键只能出现一次。
  • 试试QMultiMap
  • File 是键而不是文件名,它是 File 的一个字段,并且 == 不用于确保使用唯一键(如 java 中的 equals)。

标签: c++ qt qmap


【解决方案1】:

在此示例中,当使用比较器 NAME 时,具有相同的条目 name (QString) 只插入一次。

这就是地图和集合的工作方式。每个键在集合中都是唯一的[1]。如果您想要多个比较相同的Files,您可以使用QMultiMap&lt;File, bool&gt;QVector&lt;std::pair&lt;File, bool&gt;&gt;

如果我在所有情况下都返回 false,最终地图只包含一个 条目(第一个插入的)。

这是因为定义的排序将所有内容与其他所有内容进行比较。

  1. 在等价关系!(a &lt; b) &amp;&amp; !(b &lt; a)下唯一。更一般地,对于二元谓词 comp,您有一个二元谓词 equiv,它由 equiv(a, b) = !comp(a, b) &amp;&amp; !comp(b, a) 定义

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多