C++之迭代器失效总结】的更多相关文章

之前看<C++ Primier>的时候,也解到在顺序型窗口里insert/erase会涉及到迭代器失效的问题,并没有深究.今天写程序的时候遇到了这个问题. 1 莫名其妙的Erase 最初我的程序是酱紫的,别说话,我知道这样是有问题的,可这样是最直观的想法 int arr[]={0,1,2,3,4,5,6,7,8,9,10}; vector<int> a(arr,arr+sizeof(arr)/sizeof(*arr));for (auto it = a.begin(); it !=…
下面材料整理自Internet&著作. STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector .deque):另一类是以不连续的节点形式存储的容器(如:list.set.map).在使用erase方法来删除元素时,需要注意一些问题. 1.list,set,map容器 在使用 list.set 或 map遍历删除某些元素时可以这样使用: 1.1 正确写法1 std::list< int> List; std::list< int>::iterato…
顺序容器的添加.访问.删除操作以及forward_list的特殊操作,还有迭代器失效问题. 一.向容器添加元素 // array不支持这些操作 // forward_list有自己撰于的版本的insert和emplace // forward_list不支持push_back和emplace_back // vector和string不支持push_front和emplace_front c.push_back(t); 在c的尾部创建一个值为t或由arg创建的元素 c.emplace_back(…
my_container.erase(iter); 其中my_container是STL的某种容器,iter是指向这个容器中某个元素的迭代器.如果不是在for,while循环中,这种方式删除元素没有问题,如果是在for,while中对m_container迭代,删除其中符合条件的所有元素,就可能出现问题.如果是在for,while中对m_container迭代,删除其中符合条件的所有元素,就可能出现问题. 问题是: 在迭代容器的时候删除元素,可能导致迭代器失效(invalidation of i…
1 改变容器的大小 我们可以使用resize来增加或缩小容器,与往常一样,array不支持resize.如果当前大小大于所要求的大小,容器后面的元素会被删除:如果当前大小小于新大小,会将新元素添加到容器后部: list<int> ilist(10,42);   //10个int:每个的值都是42 ilist.resize(15);   //将5个值为0的元素添加到ilist的末尾 ilist.resize(25,-1);  //将10个值为-1的元素添加到ilist的末尾 ilist.resi…
使用过STL的人都应该知道关于迭代器失效的原理,这里以后vector迭代器失效为例: 第一种:当插入一个元素到vector中,如果插入后容器已满,那么容器将新开辟一块内存区域,然后 将原内存中的数据拷贝到新的内存区域,同时释放旧的内存.这样之前指向旧内存的迭代器就会指向 不确定内存,这块内存要么释放,要么释放后又用作其他用途.这便导致了迭代器失效. 第二种:当删除容器中一个元素后,该迭代器所指向的元素已经被删除,那么也造成迭代器失效. 这里我们主要讨论下第二种情况. 我们先举个例子说明: 比如v…
Vector 1.内部数据结构:连续存储,比如数组. 2.随机訪问每一个元素,所须要的时间为常量. 3.在末尾添加或删除元素所需时间与元素数目无关,在中间或开头添加或删除元素所需时间随元素数目呈线性变化. 4.可动态添加或降低元素.内存管理自己主动完毕,但程序猿能够使用reserve()成员函数来管理内存. 5.迭代器失效 插入:vector的迭代器在内存又一次分配时将失效(它所指向的元素在该操作的前后不再同样).当把超过capacity()-size()个元素插入vector中时.内存会又一次…
一.vector 所有读操作.swap.std::swap:都不会引起迭代器失效... clear.operator=.assign:都会引起全部变量迭代器失效 reserve.shrink_to_fit:如果capacity的大小被改变了,则引起全部变量迭代器失效 erase:被删除的变量以及其后面的变量包括end()都迭代器失效 push_back.emplace_back:假如capacity的大小被改变,则引起全部变量迭代器失效.否则只是end()迭代器失效 insert.emplace…
一般来说,swap操作将容器内容交换不会导致容器的指针.引用.迭代器失效. 但当容器类型为array和string时除外. 原因在于:SSO  (Short String Optimization 指C++针对短字符串的优化.) 默认情况下,C++的std::string都是存储在heap中,导致访问std::string需要经过一次寻址过程,速度较慢,并且这种实现的空间局部性不好,对cache的利用较低. 很多string的字符串长度很小,这个时候,我们可以把字符串存储到栈上,从而不需要进行内…
提示 文中涉及知识点: Collection . Iterator Guava 中的 Lists.partition 方法 如果你对这两个知识点不了解,强烈建议阅读文中引用的参考文章. 场景一:以ArrayList为例 参考文章 java迭代器失效 和 Collection与Iterator的remove()方法区别与ConcurrentModificationException异常 ,可将迭代器和 Collection 的不同理解为:迭代器是基于 Collection 的一个视图,迭代器执行诸…