例如,假设我有一个const_iterator:
QHash<const QString, QPair<const Node, double> >::const_iterator citer = adjNodeHash.begin();
然后我可以将citer存储在一个数据结构(包含许多迭代器)中并稍后重新使用它,它仍然指的是我下次使用时离开的那个地方吗? (假设我相应地更新它/在我递增它时使用它的引用)
我问这个是因为我使用了这种方法但是我得到了一些未定义的行为,我想知道这是否是罪魁祸首。
非常感谢任何帮助。
答案 0 :(得分:6)
标准中描述了std
容器的迭代失效规则。 QHash
在其文档中也会有一些迭代器失效规则(希望如此!)。
存储的迭代器在无效之前一直有效。大多数哈希映射在它们“rehash”时会使它们的迭代器失效,当它们超过某个边界时会发生这种情况。
实际上,在一个添加或删除元素的时间段内将迭代器存储到哈希映射中可能是个坏主意。保持迭代器有效将进行持续的维护和错误检查,为每次使用该哈希映射增加开销,并且可能不会立即显示任何开发的错误,并且在发生错误的地点附近不会发生错误
最重要的是,如果你换掉你正在使用的哈希容器,迭代器失效规则的细节将会有所不同。这使得将来的重构更加痛苦。