0

次の小さなコードを検討してください。

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 のキーでエントリを反復する必要なく、重複をチェックする方法はありますか?

4

2 に答える 2

0

もちろん挿入です。人のオブジェクトではなく、ポインター (つまり、メモリ内のアドレス) を比較しているためです。もちろん、ポインタ p1 は p2 とは異なります。最も簡単な解決策は、コンテナーにポインターではなく値を格納することです。

QMultiHash<int, Person> personHash; 

副次的な利点として、動的割り当てと割り当て解除を処理する必要がありません (この場合は問題になる可能性があります)。

于 2013-12-17T16:59:08.873 に答える