QMap/QHash操作符[]返回引用有效性

QMap/QHash operator[] returned reference validity

本文关键字:返回 引用 有效性 QHash 操作符 QMap      更新时间:2023-10-16

我想知道对Qt容器内值的引用有多长时间,特别是QHashQMap是有效的。我所说的有效是指在插入或删除其他元素后,它仍然保证指向map/hash中的正确位置。

让我们写下面的代码:

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,或者它会导致段错误或未定义(因此有时工作,其他时间段错误,取决于数据结构是否必须在内部重新组织,如调整哈希表数组的大小)。行为是相同的QMapQHash,或将一个工作和另一个不?

这在文档—你一定错过了!

当容器中的数据存在时,这两种类型的迭代器都无效是否由于调用?而被修改或从隐式共享副本中分离非const成员函数
因此,尽管我希望迭代器/引用在实践中在您上面描述的场景中保持有效,但您不应依赖于此。以这种方式使用它们将调用未定义行为。

适用于QHashIteratorQMutableHashIterator,以及裸引用。谨防非权威引用声称相反,依赖于可能随时变化的实现细节。

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

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