c++ STL 迭代器失效问题
1个回答
展开全部
迭代器失效,有两个层面的意思,
1) 无法通过迭代器++,--操作遍历整个stl容器。记作: 第一层失效。
2) 无法通过迭代器存取迭代器所指向的内存。 记作: 第二层失效。
关于这个问题, 不同的容器对应的结果是不同的。
vector
vector是个连续内存存储的容器,如果vector容器的中间某个元素被删除或从中间插入一个元素, 有可能导致内存空间不够用而重新分配一块大的内存。
这个动作将导致先前获取的迭代器,,第一层和第二层均失效。
map
map内部是红黑树结构,当map中新插入或删除元素后,树的结构会相应的调整。
但是,通过先前的迭代器,仍然可以通过++可以遍历map。 能遍历到值>当前迭代器的节点。 (没有看具体stl内部实现,初步代码验证正确)
迭代器指向的用户数据内存始终有效。
list
同理map, 通过++只能遍历链表右侧的节点,迭代器指向的用户数据内存也始终有效。
1) 无法通过迭代器++,--操作遍历整个stl容器。记作: 第一层失效。
2) 无法通过迭代器存取迭代器所指向的内存。 记作: 第二层失效。
关于这个问题, 不同的容器对应的结果是不同的。
vector
vector是个连续内存存储的容器,如果vector容器的中间某个元素被删除或从中间插入一个元素, 有可能导致内存空间不够用而重新分配一块大的内存。
这个动作将导致先前获取的迭代器,,第一层和第二层均失效。
map
map内部是红黑树结构,当map中新插入或删除元素后,树的结构会相应的调整。
但是,通过先前的迭代器,仍然可以通过++可以遍历map。 能遍历到值>当前迭代器的节点。 (没有看具体stl内部实现,初步代码验证正确)
迭代器指向的用户数据内存始终有效。
list
同理map, 通过++只能遍历链表右侧的节点,迭代器指向的用户数据内存也始终有效。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询