QMap/QHash操作符[]返回引用有效性
QMap/QHash operator[] returned reference validity
我想知道对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
,或将一个工作和另一个不?
这在文档—你一定错过了!
当容器中的数据存在时,这两种类型的迭代器都无效是否由于调用?而被修改或从隐式共享副本中分离非const成员函数因此,尽管我希望迭代器/引用在实践中在您上面描述的场景中保持有效,但您不应依赖于此。以这种方式使用它们将调用未定义行为。
适用于QHashIterator
和QMutableHashIterator
,以及裸引用。谨防非权威引用声称相反,依赖于可能随时变化的实现细节。
在QMap/QHash元素中使用引用没有任何问题,除非您删除了所引用的节点。qt容器的元素不会在每次插入新元素时重新分配。但是,我看不出有什么好的理由使用对容器元素的引用。
有关更多详细信息,请查看这篇关于qt容器内部实现的优秀文章
相关文章:
- 寿命延长从函数返回引用
- 了解C++如何返回引用并绑定到引用
- 返回引用实例和非引用实例(return mystr & vs mystr)之间的区别是什么?
- 从类返回引用向量
- 使用unique_ptr并返回引用,或者我应该使用shared_ptr并在需要时制作副本
- 混淆C++从函数返回引用
- 两个相同的重载运算符[]一个返回引用
- 为什么向量的.at()成员函数返回引用而不是迭代器
- C++使用和返回引用
- 返回 T 引用的 Const 函子禁止赋值
- 返回引用是否也会延长其生存期?
- 如何返回引用,然后递增迭代器
- 如果使用返回引用的函数初始化"auto"var,为什么它不声明引用类型?
- 我是否需要将 ref 与 make_pair 一起使用才能返回引用?
- 在 vector::at 返回引用后进行更改
- 为什么PyImport_ImportModule返回引用计数为 3 而不是 1 的 PyObject*
- 超出返回引用的单一实例生存期
- Boost.Python 返回引用现有 c++ 对象的 python 对象
- C++ 运算符 += 重载返回引用
- 如何声明接受转发引用并返回引用或副本的函数模板