QMap / QHash operator []返回引用有效性

时间:2011-10-30 19:05:06

标签: c++ qt dictionary qmap

我想知道对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的行为是相同的,还是一个有效,另一个无效?

2 个答案:

答案 0 :(得分:4)

the documentation完全涵盖了这一点 - 您一定错过了它!

  

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

所以,虽然我希望迭代器/引用在上面描述的场景中仍然有效 ,但你不应该依赖于此。 以这种方式使用它们将调用未定义的行为。

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

答案 1 :(得分:1)

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

有关详细信息,请查看有关qt containers internal implementation

的优秀文章