2013-12-16 10 views
0

다음 작은 코드를 고려 클래스 포인터 값 :QMultiHash 및

class Person { 
public: 
    QString name; 
    int age; 
}; 

int main() 
{ 
    QMultiHash<int, Person*> personHash; 
    Person* p1 = new Person; 
    p1->age = 24; 
    p1->name = "X"; 
    personHash.insert(p1->age,p1); 
    Person* p2 = new Person; 
    p2->age = 24; 
    p2->name = "X"; 
    if(personHash.contains(p2->age,p2)) { 
     cout << "Duplicate!!\n"; 
    } 
    else { 
     cout << "Inserted!!\n"; 
    } 
    return 0; 
} 

출력은 삽입된다!이며 해시가 내용이 아닌 포인터 값을 비교하기 때문에 예상됩니다.

키가 24 개인 항목을 반복하지 않고 중복 된 항목을 확인하는 방법이 있습니까?

+0

정확하게 멀티 해시에 저장하고자하는 것은 무엇입니까? 고유 한 값만 필요하면'QMap '을 사용하지 않으시겠습니까? – vahancho

+0

포인터가 필요한 이유를 정확히 말해 주시겠습니까? –

+0

문제는 키에 따라 항목을 검색 한 다음 처리해야하기 때문에 QMultiHash 함수 "values"를 사용할 때 key = target_Key 값의 복사본을 반환합니다. 매번 항목 클래스의 생성자를 호출하고 참조로 항목을 반환하지 않으므로 시간이 오래 걸립니다. 다른 방법이 있다면 plz 알려주세요. – Ameen

답변

0

포인터를 저장하고 비교 연산자를 제공하는 Person 래퍼를 추가하고이 래퍼를 값으로 해시에 저장할 수 있습니다.

class PersonPtr { 
public: 
    PersonPtr(Person* ptrIn) : ptr(ptrIn) {}; 
    Person* getPtr() { return ptr;} 
    bool operator ==(const PersonPtr &other) 
    { 
     return (other.getPtr()->name == ptr->name && other.getPtr()->age == ptr->age); 
    } 
private: 
    Person* ptr; 
}; 

는 당신은 메모리 누수를 방지하기 위해주의해야 - 중 공유 포인터를 사용하거나 자신의 임무를 작성하고 래퍼 클래스에 대한 생성자 + 소멸자를 복사합니다.

0

물론 삽입됩니다. 인물이 아닌 포인터 (즉 메모리의 주소)를 비교하기 때문입니다. 그리고 포인터 p1은 당연히 p2와 다릅니다. 가장 간단한 해결책은 컨테이너에 값을 저장하는 대신 포인터를 다음과 같습니다 (이 경우에 문제가 될 수 있습니다) 동적 할당 및 해제의주의를 취할 필요가 없습니다 측면 혜택으로

QMultiHash<int, Person> personHash; 

.