我想知道对Qt容器中的值的引用有多长,特别是QHash
或QMap
有效。有效我的意思是,如果在插入或删除其他元素后仍然保证仍然指向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
,否则会导致段错误或者是否未定义(因此有时会工作,其他时候会出现段错误,具体取决于是否必须在内部重组数据结构,如调整散列表数组的大小)。 QMap
和QHash
的行为是相同的,还是一个有效,另一个无效?
答案 0 :(得分:4)
the documentation完全涵盖了这一点 - 您一定错过了它!
当容器中的数据时,两种类型的迭代器都会失效 由于调用而被隐式共享副本修改或分离 非const成员函数。
所以,虽然我希望迭代器/引用在上面描述的场景中仍然有效 ,但你不应该依赖于此。 以这种方式使用它们将调用未定义的行为。
这适用于QHashIterator
和QMutableHashIterator
,以及裸引用。谨防声称相反的非权威性引用,依赖于可能随时更改的实现细节。
答案 1 :(得分:1)
在QMap / QHash元素中使用引用没有任何问题,除非您删除了引用的节点。每次插入新元素时,都不会重新分配qt容器的元素。但是,我看不出使用容器元素引用的任何好理由。
有关详细信息,请查看有关qt containers internal implementation
的优秀文章