2017-10-01 12 views
0

Qt를 배우려고합니다. 몇 가지 문제가 있었지만 일반적으로 검색을 통해 해결책을 찾았습니다. 그러나 오늘 오후에 QMap에 문제가있어서 문제를 이해하지 못합니다.<연산자가 두 개의 동일한 객체를 비교할 때 QMap이 삽입되지 않습니다.

QMap<File, bool>에서 키로 사용할 수 있도록 File 클래스를 만들고 operator<을 재정의했습니다. 문제는 항목을 삽입하여 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 초기화 : 비교기 NAME 같은 이름 (QString)와 같이 사용되는 본 예에서

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

번만 삽입된다.

모든 경우에 false를 반환하는 경우 최종지도에는 항목이 하나만 들어 있습니다 (처음 삽입 된 항목).

누군가가이 동작을 설명 할 수 있습니까?

+5

그것은지도와 세트의 작동 방법에 의해 정의 된 이항 조건 equiv 있습니다. – rustyx

+1

'QMultiMap' 시도 – Felix

+0

File은 File의 필드가 아닌 파일 이름의 키이고 ==는 고유 키 (java의 equals와 같은)를 사용하는 데 사용되지 않습니다. – naslami

답변

0

비교 자 NAME이 사용되는 경우 동일한 이름 (QString)을 가진 항목이 한 번만 삽입됩니다.

지도와 세트의 작동 방식입니다. 각 키는 컬렉션에서 고유합니다 [1]. 동일한 File이 여러 개 필요하면 QMultiMap<File, bool> 또는 QVector<std::pair<File, bool>>을 사용할 수 있습니다.

모든 경우에 false를 반환하는 경우 최종지도에는 항목 (처음 삽입 됨)이 하나만 포함됩니다.

이렇게 정의 된 순서는 모든 것을 다른 모든 것과 동일하게 비교하기 때문입니다.

  1. 등가 관계 !(a < b) && !(b < a)에서 유일합니다. 핵심은 한 번만 나타날 수 있습니다 - 더 일반적으로 바이너리 조건 comp를 들어, equiv(a, b) = !comp(a, b) && !comp(b, a)