当<时,QMap不会插入运算符比较两个相同的对象

时间:2017-10-01 18:42:57

标签: c++ qt qmap

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

我已创建了一个类文件,但我覆盖了operator<,以便能够将其用作QMap<File, bool>中的密钥。问题在于,当我尝试通过插入条目初始化QMap时,文件映射在operator<的实现意义上不包含重复条目。

 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,则最终地图只包含一个条目(第一个插入)。

有人可以解释这种行为吗?

1 个答案:

答案 0 :(得分:0)

  

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

这就是地图和集合的工作方式。每个密钥在集合中都是唯一的[1]。如果您想要多个File进行比较,可以使用QMultiMap<File, bool>QVector<std::pair<File, bool>>

  

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

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

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