我想知道对 Qt 容器内的值的引用,尤其是 QHash
或 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
或者它会导致段错误还是未定义(所以有时工作,其他时候出现段错误,这取决于是否必须在内部重组数据结构,例如调整哈希表数组的大小)。 QMap
和 QHash
的行为是否相同,或者一个有效而另一个无效?
最佳答案
the documentation 中对此进行了全面介绍— 你一定错过了!
Iterators of both types are invalidated when the data in the container is modified or detached from implicitly shared copies due to a call to a non-const member function.
因此,虽然我希望迭代器/引用在您上面描述的场景中在实践中保持有效,但您不应依赖于此。 以这种方式使用它们将调用未定义的行为。
这适用于 QHashIterator
和 QMutableHashIterator
,以及裸引用。谨防声称相反的非权威引用,依赖于可能随时更改的实现细节。
关于c++ - QMap/QHash operator[] 返回引用有效性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7947082/