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

将在最后一行设置值正确更新与ato关联的值3还是会导致段错误或未定义(所以有时工作,段错误其他时候,取决于数据结构是否必须在内部重新组织,例如调整大小的哈希表数组)。QMapand的行为是否相同QHash,或者一个有效而另一个无效?

4

2 回答 2

4

文档中对此进行了全面介绍-您一定错过了!

当容器中的数据由于调用非常量成员函数而被修改或从隐式共享副本中分离时,这两种类型的迭代器都会失效。

因此,尽管我希望迭代器/引用在您上面描述的场景中在实践中保持有效,但您不应依赖于此。以这种方式使用它们将调用未定义的行为。

这适用于QHashIteratorand QMutableHashIterator,以及裸引用。谨防声称相反的非权威参考,依赖可能随时更改的实施细节。

于 2011-10-30T20:55:19.720 回答
1

在 QMap/QHash 元素中使用引用没有任何问题,除非您删除您正在引用的节点。qt 容器的元素不会在每次插入新元素时重新分配。但是,我看不出使用对容器元素的引用的任何充分理由。

有关更多详细信息,请查看这篇关于qt 容器内部实现的优秀文章

于 2011-10-30T20:42:18.710 回答