为什么在使用reserve给vector重新分配大小之后,原来的迭代器没有失效 5C

如题。
做了好多测试,发现在使用reserve手动给vector容器分配大小后,原来容器的迭代器,引用全部都没有失效

这我就不明白了,在使用insert时,导致内存重新分配时,迭代器会失效,而是用reserve却没有。
源码看的一脸懵逼,求教大神

0

6个回答

0
xx1959590935
爱吃小泉的拉面同学 说说看你对这个博客的理解,结合我的问题
大约一年之前 回复
    vector<int> a = { 1,2,3 };
    a.reserve(10);
    vector<int>::iterator it = a.begin();
    a.reserve(1000);

    cout << (*it) << endl;
    it++;
    cout << *it << endl;

测试这段代码,使用reserve之后,原来的迭代器失效了,看第二个reserve

0
bajianxiaofendui
Simple Simple 回复xx1959590935: 你的编译器版本肯定是vs2012之前的,这种赋值方式是c++11的语法,没问题
11 个月之前 回复
xx1959590935
爱吃小泉的拉面同学 请看我自己的回答,关于复制的问题是编译器的问题,我试过了。但我在前后分别测试了capacity的值,确实发生了变化,但迭代器确实没有失效。请看我自己回答的图片。理论上应该是会失效的。但确实没有啊。我也很懵逼啊
大约一年之前 回复
meanong
meanong 回复xx1959590935: vector<int>是支持这样子赋值的,不知道你的编译器使用的是什么编译器。然后容器的使用的过程中,其实预分配的大小是大于你初始化时候的大小的,所以,当你reserve的时候,如果大小没有超过实际的大小,迭代器看起来不会生效,但是当你reserve的值很大(超过容器的实际大小)的时候,就会失效。
大约一年之前 回复
xx1959590935
爱吃小泉的拉面同学 抱歉并没有,还有啊,vector对象是不可以这么赋值的,你确定你运行过这段代码?
大约一年之前 回复

首先,vector是可以像vector a={1,2,3}这样赋值的,运行起来也没有问题
另外,我测试的时候,使用reserve之后迭代器是失效了的
reserve(count)会在当前capacity小于count并且max_size大于count的时候重新为vector分配空间
我猜你遇到的使用reserve之后迭代器没有失效,是在capacity很大,reserve的大小小于capacity的情况发生的

0
xx1959590935
爱吃小泉的拉面同学 请看我自己的回答,关于复制的问题是编译器的问题,我试过了。但我在前后分别测试了capacity的值,确实发生了变化,但迭代器确实没有失效。请看我自己回答的图片。理论上应该是会失效的。但确实没有啊。我也很懵逼啊
大约一年之前 回复

图片说明图片说明

0

图片说明

0

reserve
1.分配新的内存块,它有容器目前容量的倍数。在大部分实现中,vector和string的容量每次以2为因数增长。也就是说,当容器必须扩展时,它们的2.容量每次翻倍。
3.把所有元素从容器的旧内存拷贝到它的新内存。
4.销毁旧内存中的对象。
5.回收旧内存。
所有指向vector或string中的迭代器、指针和引用**都会失效**。这意味着简单地把一个元素插入vector或string的动作需要更新其他使用了指向vector或string中的迭代器、指针或引用的数据结构。
所以 ,**应该不存在从新分配后,迭代器的引用仍生效的情况**。

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
vector的reserve的使用(避免内存重新分配以及内存分配的方式)
文章目录vector的reserve的作用Demo:对比使用reserve的区别Demo运行结果分析新的疑问:大于capacity指定之后的动态分配重新分配空间后内存地址的变化 vector的reserve的作用 之前提到vector中不断的push_back,会进行内存的重新自动分配的问题 (详见:https://blog.csdn.net/hl_zzl/article/details/847...
实战c++中的vector系列--可怕的迭代器失效(vector重新申请内存)
vector给我们提供了很多的方便,但是偶尔也会有陷阱。当不注意的时候,就掉入其中。说到底,还是对vector的机制不够彻底掌握。很轻松的写下这段代码:#include<iostream> #include<vector> using namespace std; int main() { vector<int> v; v.push_back(1); std::vector<i
STL中vector的删除操作引起迭代器失效和空间重新配置
学习STL时vector是最先学习也是用的最多的一类容器,它的通过动态管理内存从而实现数组长度的自增长为我们的使用带来了很大方便,然而它的这一特性也带来了一些陷阱:所谓动态增加大小,并不是在原空间之后接续新空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配置一块较大空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。因此,对vector的任何操作,一
vector的插入操作使原迭代器全部失效,删除操作使其后面的原迭代器失效
vector v{ 1, 20, 30, 40, 50 }; vector::iterator iter3,iter2, iter = v.begin(); pri(v); cout iter2 = iter + 1; iter3 = iter + 3; v.insert(iter2, 10);//换成v.erase(iter2);只能输出*iter。 //cout //cou
C++关于迭代器删除(erase)插入(insert)失效问题
初学者的我在学习迭代器的时候(今天这里主要说的是vector的迭代器)碰到了一些问题,纠结了好些时候,总算弄明白了一点。 迭代器会在删除插入等操作后失效,即在其删除插入位置后的迭代器会失效,那所谓的失效是什么意思? 失效一般是指迭代器指向了和你预期不一样的位置了,但这个时候,你可以通过自增自减使它指向正确位置,但是,注意,有些时候,你是不能这样做的,迭代器会完全失效,必须重新初始化。
迭代器失效的几种情况总结
1. 对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。所以不能使用erase(iter++)的方式,还好erase方法可以返回下一个有效的iterator。 for (iter = cont.begin(
C++ vector 迭代器失效原因
众所周知,vector在内存中是顺序存储的,那么当vector的长度增加时,也就是往里面继续pushback新的数据,当前块的内存不够,vector不得不重新申请一块新的更大的内存,然后把之前的数据复制过来,再插入新的数据。 为了验证这个可以看看下面的测试代码:#include<iostream> #include<vector> using namespace std;int main() {
C++标准库---使用reserve来避免不必要的重新分配
对于vector和string来说,当它们的需要更多空间时,就会自动增加空间,而每次增加空间的容量会导致很大的开销,首先必须分配新的内存块,它有容器目前容量的几倍(在大部分实现中,vector和string的容量每次变为2倍),然后把所有元素从容器的旧内存拷贝到它的新内存,接着销毁旧内存中的对象,最后回收旧内存。      看到以上的那些步骤,我不禁对容器自动扩大空间的性能感到担忧,不仅如此,每
vector迭代器失效的几种情况
在泛型编程还是STL的实际运用中,迭代器(iterator)无疑扮演者重要的角色。迭代器是一种类似于指针的对象(如可以内容提领,成员访问等),但他又不仅仅是一种普通的指针。关于迭代器失效,我们可以看下面这个例子: #include #include void PrintVector(const vector& v) {     vector::const_iterator it =
C++ Vector swap操作前后迭代器为何不失效
1 swap操作 swap是STL泛型操作的一种。这种操作的时间复杂度极低,用于两个容器内容的交换。 例如定义vector vi1和vi2, vi1.swap(vi2),就将vi1和vi2的内容交换了。 2  问题 iterator实际上是一种指针,可以指向容器的任意位置。例如vector::iterator it1 = vi1.begin(); 这两个操作本
C++基础篇 -- vector的resize函数和reserve函数
对于C++的vector容器模板类,存在size和capacity这样两个概念,可以分别通过vector的size()和capacity()方法获得该vector当前的size和capacity值。相应的,vector提供了两个方法来分别对size和capacity进行操作,它们就是resize方法和reserve方法。 首先,对于size和capacity,这是两个比较容易混淆的概念。
vector迭代器失效解决方法 及 内存原理
迭代器失效 vector是个连续内存存储的容器,如果vector容器的中间某个元素被删除或从中间插入一个元素, 有可能导致内存空间不够用而重新分配一块大的内存。这个动作将导致先前获取的迭代器,,第一层和第二层均失效。造成失效的两个函数:
vector容器中resize与reserve的区别
Vector中的resize()与reserve()的区别 首先申明resize()和reserve()这两个成员函数都是Vector的公有成员函数(public  member function) 一、先了解vector容器的构成: 1.首先明白vector是一种顺序容器(申请的内部空间是连续的) 2.它的底层是由类模板实现的 二、这两个成员函数的意
Vector 中内存分配的问题( resize、reserve )
vector 内存分配、resize、reserve
vector的reserve和resize(转载+修改)
本篇文章转载于https://www.cnblogs.com/qlee/archive/2011/05/16/2048026.html vector 的reserve增加了vector的capacity,但是它的size没有改变!而resize改变了vector的capacity同时也增加了它的size!原因如下:      reserve是容器预留空间,但在空间内不真正创建元素对象,所以在没有添...
vector使用erase后,迭代器变得不稳定
发现问题背景 在执行以下代码时,会产生错误: for (it = pipe.begin(); it!=pipe.end(); it++) { if (*it == 1) { pipe.erase(it); //调用完erase之后,迭代器it变为野指针(很不稳定) it--; //这一步开始出错 } } 解决方法 for (it = pipe.begin();...
map和set关联容器迭代器失效的问题
STL map和set的使用虽不复杂,但也有一些不易理解的地方,如:      为何map和set的插入删除效率比用其他序列容器高?     为何每次insert之后,以前保存的iterator不会失效?     为何map和set不能像vector一样有个reserve函数来预分配数据?     当数据元素增多时(10000到20000个比较),map和set的插入和搜索
std::vector的reserve、resize与堆内存破坏
今天费了一个下午调试一个诡异的内存崩溃问题(coredump)基本上可以稳定复现,但会有不同。经分析崩溃栈,发现都是malloc内存时出现了signal 11段错误?分配内存时崩溃有可能是传入了非法size值,比如说-1或者0什么的,但那种情况下会抛bad alloc异常,或者返回空指针。起初怀疑是std::string的默认allocator的问题,甚至怀疑是全局变量未初始化导致的问题。。。但是...
STL容器的遍历插入或删除(迭代器失效问题的统一解决)
STL容器根据迭代器的失效问题,其实可以分为两类容器: (1)数组型容器的插入删除操作:vector、string、deque(均为顺序存储)         由于这类容器的插入或删除都会使所有迭代器失效,因此每次插入删除后都需要重新定位 (2)结点型数据容器的插入删除操作:list(使用链表存储)、map(使用红黑树存储)、set(使用红黑树存储)         由于这类容器删除时只会
对于vector容器内的 reserve() 预留容量函数
在《c++Primer》中看到了reserve()的介绍,想到一个问题,如果reserve(n)中n的值比capacity()的值小,那么这个函数将返回什么,继续看了下书,好像没提到,经代码测试后,发现如果n的值小于capacity()的值,则此句无效,也不返错,即等于这段代码没有执行一样。这就是意味着reserve(n)不是在原来容量的基础上再扩展一些容量,而是预留整个容器的容量值为n,且n的值
【C++】vector的迭代器使用中出现的程序中断
目的: STL在很久以前就在使用了,当时记得是做一个基于OPENCV图像处理库,主要由C++编写的小游戏,STL用于处理游戏中的角色的死亡和添加、遍历,在那款游戏的设计中,STL并没有涉及到很细致的部分,但在最近进行一个需要大批量地使用STL的时候出现了很多的错误,重新细致地翻阅了c++Primer 之后,现在将错误进行总结并说明为何出错和如何改正。 随机访问容器如vector和list,在迭
vector删除元素后iterator失效
从一个简单的问题开始,删除数组中某个元素后连续重复的元素,例如 1,1,2,3,3,1,1,1,4,0 ---> 1, 2,3,1,4,0。 考虑了几秒,然后就开始动手写代码了: #include  #include  using namespace std; int main(int argc, char* argv[]) {    int a[] = {1, 1,
vector重新申请内存
一、realloc函数介绍 realloc原型是externvoid *realloc(void *mem_address, unsigned int newsize); 先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原
c++ erase 会使迭代器失效
因为erase函数会真正删除元素,导致后面的元素前移,因此后面的迭代器失效(不能引用到正确的结果)所以每次执行完erase操作之后,后面的迭代器都会失效,看看下main的代码:int removeDuplicates(vector& nums) { map tmp_map; for(vector::iterator it = nums.begin(); it != nu
C++ STL 迭代器失效问题
之前看《C++ Primier》的时候,也解到在顺序型窗口里insert/erase会涉及到迭代器失效的问题,并没有深究。今天写程序的时候遇到了这个问题。 1 莫名其妙的Erase     最初我的程序是酱紫的,别说话,我知道这样是有问题的,可这样是最直观的想法 int arr[]={0,1,2,3,4,5,6,7,8,9,10};   vectorint> a(arr,arr+s
没有躲过的坑--vector使用erase后迭代器变成野指针
vector上镜率非常高,但是最近又被他fuck了一下。使用的就是vector的erase方法。erase–return value 首先需要明确一下vector的两种erase:C++98中是这样的:iterator erase (iterator position); iterator erase (iterator first, iterator last)C++11是这样的:iterat
vector的erase失效问题
VS和CGwin的实现效果还不一样,这里先记录下问题及解决方法。欢迎和大家一起探讨。 vector容器erase操作后iterate失效真相 一、VS环境下erase代码分析 代码: for (auto iter = vec.begin(); iter != vec.end(); ++iter) { if (3 == *iter) { ...
容器vector和迭代器iterator的学习使用
vector、algorithm、deque、functional、iterrator、list、map、memory、numeric、queue、set、stack、utility vector的声明: vector vec;size();resize();at();front();back();begin();end();rbegin();rend();empty();assi
deque及迭代器失效问题
deque由一段一段的定量连续空间构成,采用一个表(map)来记录每个连续空间的首址,map是一小块连续的空间,目的是便于迭代器的寻址(map+1即可跳转到下一个连续空间的首址)。map中的每一个元素(node)都是指针,指向另一端(较大的)连续线性空间,称为缓冲区,缓冲区才是deque的储存空间主体。具体机制如下所示: 其中,对迭代器it的解引用得到的是cur位置处对应的元素。 de
C++ vector容器erase操作后iterate失效真相
在使用STL Vector容器时,大家一定遇到进行erase操作后,迭代器会失效的现象。网上很多文章解释说,是因为Vector的底层是通过数组来实现的,erase之后会造成内存的重新分配,故原容器的迭代器便失效。 我以前也一直这样认为,从来没有深究过,最近在研读《STL 源码剖析》的第四章时,发现如下代码: iterator erase(iterator postion) { if
STL中的erase操作导致指针失效问题
在代码运行过程之中,发现STL使用erase函数进行数据删除时会发生不知名错误,在此予以代码改进 #include #include #include #include using namespace std; int main(){ vector m, v; //ininal m m.push_back(200); m.push_back(300); m.push_back(500
STL map 内存改变,迭代器失效,crash
http://blog.163.com/cp7618@yeah/blog/static/702347772012114103640735/ 问题描述 游服文件TGameObjmap.h类TGameObjMap封装使用std::map, 在使用过程中会出现crash. 原因分析 我们发现在使用TGameObjMap中,由于多线程没同步好或在使用迭代器同时内存改变,才导致的crash
容器操作resize()的误用
resize(n),一般是用来改变容器的大小,使其包含n个元素。如果n小于当前容器的尺寸较小,内容调减至其前n个元素,并把多余出来的元素销毁掉。 如果n大于当前容器大小,内容则是在末尾插入一定的元素直至扩展到n个元素。如果val被指定,新的元素被初始化为val的副本,否则,他们都是值初始化。 如果n也大于当前容器的容量,所分配的存储空间的自动重新分配发生。
STL — STL迭代器的原理以及迭代器失效
STL迭代器                                                                                                                     作为STL六大组件之一Iterator(迭代器)模式又称Cursor(游标)模式,用于提供一种方法顺序访问一个聚合对象中各个元
c++ : resize 之后的vector, 又push_back 新元素, 元素取地址 问题
这篇博客中有一个基本的介绍, 但面对的问题是一开始vector是空的, 于是可以直接先reserve()一个大小。https://blog.csdn.net/wuhuaiyu/article/details/45953643但如果一开始先将vector resize()了大小,用for语句赋了元素的值(这些元素的值都被记录下来,之后要用); 之后又不断push_back值, 每次push_back...
vector迭代器失效问题
以下这段话来自《C++标准程序库》—第六章STL容器 “vector迭代器失效发生在下列两种情况 (1)使用者在一个较小索引位置上安插和移除操作 (2)由于容量变化而引起内存分配” 要深刻理解这段话并不容易—- 其实这里迭代器失效的两种情况代表了两种不同的失效含义: 1.当在vector中的某一位置安插(v.insert())或移除(v.erase())某个元素时,且当安插操作时
leetcode 78!!!vector push_back不能和迭代器同时使用!!!
Given a set of distinct integers, nums, return all possible subsets. Note: The solution set must not contain duplicate subsets. For example, If nums = [1,2,3], a solution is: [ [3], [1],
vector容器的end是指向最后一个元素的下一个位置,使用时要将迭代器减1,才能获取到最后一个
vector容器的end是指向最后一个元素的下一个位置,使用时要将迭代器减1,才能获取到最后一个 原因: Cont是容器的类型,容器中定义了一个此容器所用的游标(迭代器)的类型,叫iterator,于是Cont::iterator it;就定义了一个名叫it的迭代器。 啥?我咋知道容器中怎么定义了iterator这个类型?嘿嘿,这就是一个Concept了。这是约定,这是规矩!STL中所有的容
STL list erase 删除一个节点后,迭代器会失效吗
STL list erase 删除一个节点后,迭代器会失效吗
聊聊map和vector的迭代器失效问题(某公司招聘笔试试题)
当删除一个STL容器(比如map, vector)中的某个元素时, 会引起迭代器失效, 所以, 我们务必提高警惕。 某次笔试, 我遇到这样一个题目: 删除map<int, int>中value为5的倍数的元素。 该题看起来很自然很简单, 实则有迭代器失效的陷阱。        如果对迭代器失效问题一无所知, 则很容易写出如下的错误代码: #include #include using namespace std; typede
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 为什么高校课程没有nlp java迭代器学习