2

次のコードがあるとします。

QList<Vertex*> _vertices; //this gets filled

//at some other point i want to check if there's already
//a vertex with the same payload inside the list
Vertex* v = new Vertex(payload);
int result = _vertices.indexOf(v);
if (result == -1){
    //add the vertex to the list
} else {
    //discard v and return pointer to match
}

//overloaded Vertex::operator==
bool Vertex::operator==(Vertex* other){
    //i return true if my payload and the others
    //payload are the same
}

私が見る限り、indexOf() が自分の operator== を呼び出すことは決してありません。これは、ポインター型をカプセル化する QList とポインターを比較する indexOf() が原因であると思います。ポンターを QList に保持し、独自の operator==() を使用する方法はありますか?

お気に入りVertex*::operator==(Vertex* other)

関連する質問:ポインター型 Qlists の削除| ポインタ型のため動作しない

編集:意図。

2 つの頂点は等しいと見なされます。それらのペイロードによって運ばれる識別子は等しいです。

VertexGraphクラスの一部です。Graph::addEdge(Payload,Payload)そのクラスのクライアントが呼び出してグラフを作成できるようにしたい。その後、Graph オブジェクトは、ペイロードを Vertex オブジェクトにラップし、Edge を構築します。したがって、Graph は、特定のペイロードをカプセル化する Vertex がまだ存在しないかどうかを確認する必要があります。QList を使用することは、コードを書いている時点では「動作する可能性のある最も簡単なこと」のように思えました。

4

1 に答える 1

3

QListにポンターを保持し、それでも自分の演算子==()を使用する方法はありますか?

いいえ、最初にポインターを逆参照するためにQListが必要になりますが、そうではありません。そのためには、QListをサブクラス化する必要があります。しかし、indexOf()繰り返して使用を比較するだけoperator==()で、同じことを手動で行うのを妨げるものは何もありません。

ただし、これはすべてコードの臭いのように見えます。順序付けされていない/ハッシュされていないコンテナで何かを見つけようとするのは線形時間です-QMap/QHashと比較して非常に遅いです。なぜこれを実行したいのか、どのデータに含まれているのかを説明する質問を編集してくださいVertex。コミュニティがより優れたパフォーマンスのメカニズムに対応できるかどうかを確認します。

于 2012-05-15T11:19:02.757 に答える