条款9:在删除选项中仔细选择 我们必须保证在调用erase之前就得到了c中下一元素的迭代。最容易的方法是当我们调用时在i上使用后置递增: AssocContainer<int> c;...for (AssocContainer<int>::iterator i = c.begin(); // for循环的第三部分 i != c.end(); // 是空的;
转载 2011-03-21 14:06:00
103阅读
2评论
1、对于基于连续内存的容器,容器元素的增删,有可能会导致迭代失效。考虑: int main(int argc, char* argv[]) { vector<int> intVec; intVec.push_back(1); intVec.push_back(2); intVec.push_back(3); vector<int>::iterator iter1 =
转载 2015-06-14 19:51:00
28阅读
一、迭代 迭代(iterator)是一个可以对其执行类似指针的操作(如:解除引用(operator*())和递增(operator++()))的对象,我们可以将它理解成为一个指针。但它又不是我们所谓普通的指针,我们可以称之为广义指针,你可以通过sizeof(vector::iterator)来查 ...
转载 2021-09-10 23:20:00
171阅读
2评论
迭代失效: 典型的迭代失效. 首先对于vector而言,添加和删除操作可能使容器的部分或者全部迭代失效。那为什么迭代失效呢?vector元素在内存中是顺序存储,试想:如果当前容器中已经存在了10个元素,现在又要添加一个元素到容器中,但是内存中紧跟在这10个元素后面没有一个空闲空间,而vector的元素必须顺序存储一边索引访问,所以我们不能在内存中随便找个地方存储这个元素。于是vector必须重新分配存储空间,用来存放原来的元素以及新添加的元素:存放在旧存储空间的元素被复制到新的存储空间里,接着插入新的元素,最后撤销旧的存储空间。这种情况发生,一定会导致vector容器的所有迭代...
转载 2013-08-06 18:07:00
198阅读
2评论
1. 对于序列型容器:vector, deque删除当前元素:从当前位置到之后全部位置迭代失效;(可以用 it=res.erase(it); 来实现迭代的更新追踪)添加一个元素:当添加元素后,导致了容器扩容的操作,则全部迭代失效;(可以用 it=res.push(it);)插入一个元素:当添加的元素在首尾位置以外,所有迭代失效;(在首位添加元素会导致迭代失效,但是指针和引用不会失效;)
前言迭代(iterator)是一个对其执行类似指针操作的对象,我们平常理解它为一个指针,但它其实并不是我们所谓真正意义上的指针,当你sizeof查看时,会发现其所占内存并不是4字节。迭代是个所谓的复杂的指针,具有遍历复杂数据结构的能力。其下层运行机制取决于其所遍历的数据结构。因此,每一种容器型都必须提供自己的迭代。那么,大致介绍完迭代的概念,下面来探讨下迭代在各种容器中失效的情况,其可分
1.序列容器对于序列式容器(如vector,deque),删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。所以不能使用erase(iter++)的方式,还好erase方法可以返回下一个有效的iterator。序列容器,在内存中是一块连续的内存,当删除一个元素后,内存中的数据会发
1. 对于关联容器(如map, set, multimap,multiset),删除当前的iterator,仅仅会使当前的iterator失效,只要在erase时,递增当前iterator即可。这是因为map之类的容器,使用了红黑树来实现,插入、删除一个结点不会对其他结点造成影响。 for (iter = cont.begin(); it != cont.end();) {
list的迭代失效(erase)此处大家可将迭代暂时理解成类似于指针,迭代失效迭代指向的节点无效,即该节点被删除了。因为list的底层结构为带头节点的双向循环链表,因此在list中进行插入的时候是不会导致list的迭代失效的,只有在删除的时候才会失效,并且失效的只是指向被删除节点的迭代,其他迭代不会受到影响。void TestListIterator(){ int arr[...
迭代(iterator)是一个可以对其执行类似指针的操作(如:解除引用(operator*())和递增(operator++()))的对象,我们可以将它理解成为一个指针。但它又不是我们所谓普通的指针,我们可以称之为广义指针,你可以通过sizeof(vector::iterator)来查看,所占内存并不是4个字节。     首先对于vector而言,添加和删除操作可能
转载 2017-06-17 18:08:57
628阅读
迭代失效小实例:void PrintVector(vector& v){ vector::iterator it = v.begin(); while (it != v.end()) { cout << *it << " "; ++it; } cout << endl;}void TestVector(){ vector v; v.push_back(1);
原创 2022-09-02 13:53:21
45阅读
1、什么是迭代失效(可能你一上来,面试官就会问你这个问题了)我简单总结一句:迭代失效就是因为插入和删除,使得原本可以访问到容器内迭代的元素,变得无法再访问。因为插入和删除可能更改了元素在内存中的位置,原来迭代指向的位置不再存储原有的值。2、map的迭代失效要想说迭代失效问题,我们就得来看看迭代为啥会失效?先来看一个题,很简单,就是删除map中可以被n整除的数字。可能第一眼我们这么写:
在实现LRU算法的时候lru_list 開始用的是deque 可是由于害怕其在插入删除上的迭代失效情况的诡异情况。遂用list取代之。 在数据量比較大的时候性能不是非常好。性能优化分析的时候决定用deque替换回来。于是对deque迭代失效的情况好好研究了一下: c++ primer如此写道:
转载 2018-02-15 20:49:00
260阅读
2评论
vector迭代什么时候会失效? 一、 push_back导致迭代失效 vector在push_back的时候当容量不足时会触发扩容,导致整个vector重新申请内存,并且将原有的数据复制到新的内存中,并将原有内存释放,这自然是会导致迭代失效的,因为迭代所指的内存都已经被释放。 二、inse ...
转载 2021-08-11 09:30:00
157阅读
2评论
关于迭代失效,,今天做一个总结。迭代失效分三种情况考虑,也是三种数据结构考虑,分别为数组型,链表型,树型数据结构。
原创 2022-11-04 10:57:09
384阅读
vector迭代失效问题(insert、erase)我们用代码的形式呈现给大家:#include<iostream>#include<vector>using namespace std;int main(){ int a[] = { 1, 2, 3, 4 }; vector<int> v(a, a + sizeof(a) / sizeof(i...
今天同学华为面试被问到vector有什么问题了,我一拍脑门,vector有什么问题?? 原来是迭代失效问题。先看看vector中: void test_vector_erase(){ vector<int> v = {1,2,3,4,5}; for(auto it = v.begin(); it ...
转载 2021-09-14 16:19:00
182阅读
2评论
当我们insert或erase后,迭代底层会将当前迭代指向容器的指针置空(迭代不仅要指向容器元素,还有一个成员记录指向的是哪个容器对象)
原创 2022-09-17 02:57:38
104阅读
迭代,stl库使用
转载 2020-01-01 16:43:00
217阅读
2评论
  • 1
  • 2
  • 3
  • 4
  • 5