6

Qt コンテナ内の値、特に aQHashまたは aへの参照QMapが有効な期間はどれくらいか疑問に思っていました。有効とは、他の要素を挿入または削除した後もマップ/ハッシュ内の正しい場所を指すことが保証されていることを意味します。

次のコードにしましょう。

QHash<char,int> dict; // or QMap<char,int> dict;
dict.insert('a', 1);
int& val(dict['a']);

dict.insert('b', 2);

val = 3;             // < will this work or lead to a segfault

最後の行に値を設定すると、に関連付けられている値が正しく更新aされます3か、それとも segfault につながるか、未定義になります (そのため、サイズ変更など、データ構造を内部的に再編成する必要があるかどうかに応じて、時々機能し、segfault が別の場合に機能します)ハッシュテーブル配列の)。QMapとの動作は同じQHashですか、または一方が機能し、もう一方が機能しませんか?

4

2 に答える 2

4

これはドキュメントで完全にカバーされています— あなたはそれを見逃しているに違いありません!

非 const メンバー関数の呼び出しにより、コンテナー内のデータが変更されたり、暗黙的に共有されたコピーから切り離されたりすると、両方の型のイテレーターが無効になります。

したがって、上記のシナリオでは、イテレータ/参照が実際には有効であると予想されますが、これに依存しないでください。この方法でそれらを使用すると、未定義の動作が呼び出されます。

これは、QHashIteratorおよびQMutableHashIteratorだけでなく、裸の参照にも当てはまります。いつでも変更される可能性がある実装の詳細に依存して、反対の主張をする権威のない参照に注意してください。

于 2011-10-30T20:55:19.720 に答える
1

参照しているノードを削除しない限り、QMap/QHash 要素で参照を使用しても問題はありません。qt コンテナーの要素は、新しい要素が挿入されるたびに再割り当てされるわけではありません。ただし、コンテナー要素への参照を使用する正当な理由がわかりません。

詳細については、qt コンテナーの内部実装に関するこの優れた記事を確認してください。

于 2011-10-30T20:42:18.710 に答える