1、序列容器 1)内存连续,如vector。 删除(erase)一个元素,会导致其后面的元素都向前移动,则对应的迭代器都会失效。 尾部添加(push_back)一个元素,如果引起内存重新分配,则迭代器全部失效。 2)内存不连续,如list。 删除(erase)一个元素,只有当前元素对应的迭代器会失效。 2、关联容器 内存不连续,如map。 删除(...
迭代器是一个“可以遍历STL容器内全部或部分元素”的对象,在操作上有点类似C语言中的指针,不同的是:迭代器是个所谓的“smart pointer”,具有遍历复杂数据结构的能力,根据不同的容器具有不同的操作行为。迭代器被分为不同的类型,如图1所示;其能力列表如图表1。 图1 迭代器类型 表1 迭代器能力 Input迭代器 inpu...
一. 关联式容器 对于关联式容器(如map,set,multimap,multiset),删除当前节点的迭代器,仅仅会使当前的迭代器失效,只要在 erase 迭代器时,递增当前的迭代器即可。这是因为map之类的容器,使用了红黑树来实现,插入,删除一个结点不会对其他结点造成影响。使用方式如下例子: 二. 非关联式容器(序列式容器) 对于序列式容...
存储空间的重新分配会导致迭代器失效。🔄 删除元素迭代器发生什么变化? 对于关联容器(如map,set,multimap,multiset),删除当前的iterator,仅仅会使当前的iterator失效,只要在erase时,递增当前iterator即可。 对于序列式容器(如vector,deque),删除当前的iterator会使后面所有元素的iterator都失效。 对于list,它使用了不连续...
存储空间的重新分配会导致迭代器失效 6.删除元素会导致迭代器发生什么变化 答案: 1) 对于关联容器(如map, set,multimap,multiset),删除当前的iterator,仅仅会使当前的iterator失效,只要在erase时,递增当前iterator即可。这是因为map之类的容器,使用了红黑树来实现,插入、删除一个结点不会对其他结点造成影响。
c++迭代器失效的问题汇总(Summary of c++ iterator failures)Summary of C++ iterator failures First, for vector, adding and deleting operations can cause partial or full iterator invalidation of the container. So why does the iterator fail? The vector element is stored in memory, if the current ...
针对vector容器,失效情况还有: 1.当插入(push_back)一个元素后,end操作返回的迭代器肯定失效。 2.当插入(push_back)一个元素后,capacity返回值与没有插入元素之前相比有改变,则需要重新加载整个容器,此时first和end操作返回的迭代器都会失效。 3.当进行删除操作(erase,pop_back)后,指向删除点的迭代器全部失效;指...
对于关联容器map set来说,使用了erase(iterator)后,当前元素的迭代器失效,但是其结构是红黑树, 删除当前元素的,不会影响到下一个元素的迭代器,所以在调用erase之前,记录下一个元素的迭代器即 可。 对于list来说,它使用了不连续分配的内存,并且它的erase方法也会返回下一个有效的iterator,因此上 面两种正确的方法...
map要删除一个元素,通常通过erase()函数来完成,但是要注意,如果我们传入了一个iterator作为erase的参数来删除当前迭代器所指向的元素,删除完成后iterator会失效,产生未定义行为。 正确的使用方法应该是接收erase()的返回值,让iterator指向被删除元素的下一个元素或者end()。
deque 和 vector 的情况类似, 而list双向链表每一个节点内存不连续, 删除节点仅当前迭代器失效,erase返回下一个有效迭代器;map/set等关联容器底层是红黑树删除节点不会影响其他节点的迭代器, 使用递增方法获取下一个迭代器 mp.erase(iter++); unordered_(hash) 迭代器意义不大, rehash之后, 迭代器应该也是全部失...