我试图学习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,则最终地图只包含一个条目(第一个插入)。
有人可以解释这种行为吗?
答案 0 :(得分:0)
在此示例中,比较器NAME使用相同的条目 name(QString)只插入一次。
这就是地图和集合的工作方式。每个密钥在集合中都是唯一的[1]。如果您想要多个File
进行比较,可以使用QMultiMap<File, bool>
或QVector<std::pair<File, bool>>
。
如果我在所有情况下都返回false,则最终地图只包含一个 条目(第一个插入)。
这是因为定义的排序将所有内容与其他所有内容进行了比较。
!(a < b) && !(b < a)
下的唯一。更一般地,对于二元谓词comp
,您有一个由equiv
定义的二元谓词equiv(a, b) = !comp(a, b) && !comp(b, a)