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

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

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

6个回答

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

bajianxiaofendui
Simple Simple 回复xx1959590935: 你的编译器版本肯定是vs2012之前的,这种赋值方式是c++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的情况发生的

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

图片说明图片说明

图片说明

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

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...
vector的reserve函数
#includern#includernrnusing namespace std;rnrnint main( )rnrn vector< int > Myvector;rn rn Myvector.reserve( 4 );rn for( unsigned int i = 0; i < 4; i++ )rn rn Myvector[i] = i;rn cout << Myvector[i] << endl;rn rnrn return 0;rnrnrn在Visual Studio 2005中,运行程序显示:【5580】中发生未处理的win32异常。rnrn1.将Myvector.reserve( 4 );改为Myvector.resize( 4 ),程序运行正常;rn2.将Myvector[i] = i;改为Myvector.push_back( i ),程序运行正常;rnrn我的猜想是:reserve( )函数是为vector保留适当的容量,但编译器并未真正给它分配空间,所以执行语句Myvector[i] = i;时出错。请高手指教!!!
vector的reserve(),resize(),capacity()
1:vetor a; a.reserve(100); 代表预留空间是100,capacity()的返回值也是就100; vector功能和数组相似,capacity类似于我们通常预设定的数组的最大元素个数,如a[10],代表的就是a数组最多10个元素; 代码如下: // vector::reserve #include #include int main () { std:
指定C++ vector、二维vector的大小及resize与reserve的区别
前言 vector是一个动态的数组,我们最常使用push_back()向vector中添加元素。但是有时候我们希望在vector创建之后就按照下标来访问vector中的元素,如果直接v[i]是会报错的,因为此时vector的size是0,其中还没有元素。如何初始化vector到我们想要的大小呢。这就需要用到vector的resizeh函数了。 resize 首先看resize的函数原型 void ...
关于vector的reserve()
vector 中的capacity() 是如何增长的,rnvector.reserve(20);rn当插入元素超过20 ,是成倍(*20)还是加20
vector 中reserve的疑惑
class test rn rnint i; rnpublic: rntest(int j); rntest(const test &t); rntest(); rntest & operator=(const test & t); rnvoid print(); rn~test(void); rn; rntest::test(int j) rn rni = j; rncout<<"Creating test"<vec) rn rnint result=0; rnvector::iterator p=vec.begin(); rnwhile(p!=vec.end()) rnresult+=*p++; rnreturn result; rn rnrnint main() rn rnvector v_test(2);//调用一次test()构造函数,2次test rn//test(const test& t)拷贝构造函数 rnvector::size_type ret=v_test.size(); rnv_test.reserve(90);//为什么又调用了两次 rn//test(const test& t)拷贝构造函数 rnv_test[34]=v_test[1];//调用一次赋值构造函数 rn这段程序程序在执行v_test.reserve(90)时,为什么又调用了两次拷贝构造函数,reserve应该只是预定空间,不会调用构造函数啊,为什么,有人知道吗
vector 怎么样反转(reserve)?
reserve
Vector的resize()函数与reserve()
resize()函数与reserve()函数是两个极易引起混淆的函数,下面将详细的区分一下两者的不同: resize()函数:更改容器中的元素数量。 如: #include&amp;amp;lt;iostream&amp;amp;gt; #include&amp;amp;lt;vector&amp;amp;gt; using namespace std; int main() { int len=10; vector&amp;amp;lt;int&amp;amp;gt;v; v.pus...
关于vector, reserve 函数××××××××××××××××××××××××××××××××××××××
vector 的reserve 到底有啥用啊?rnrn[code=C/C++]rn vector aa;rn aa.reserve (100); 这里要不要都无所谓啊,看内存也没什么变化rn for (int i = 0; i < 100; i++)rn rn aa.push_back (i);rn rn[/code]
Vector中迭代器的使用
vector&amp;lt;int&amp;gt;::iterator v = vec.begin(); while( v != vec.end()) { cout &amp;lt;&amp;lt; &quot;value of v = &quot; &amp;lt;&amp;lt; *v &amp;lt;&amp;lt; endl; v++; }
Vector迭代器的使用
要点: 1、Vector迭代器使用erase删除元素之后迭代器指向删除元素的下一个;当删除元素是最后一个时,指向end(); 2、find()函数实现从某个范围内寻找某元素,find函数头文件是 #include        vector::iterator itertemp = find(vec.begin(), vec.end() , 5);          //在vec中寻找值为
vector迭代器的使用
1.两层vector的迭代器使用 当外层迭代器指向iter.begin();需要访问内层循环时,首先对其进行解应用(运算符重载);然后再求其begin();访问内层元素,直接对迭代器解引用。迭代器就像一串地址一样,使用迭代器,首先找到开始的地址,然后通过地址增减,迭代访问元素。访问内存vector,首先要获取内层的元素,通过begin()获得地址。 //vector当数组使用     vec
元素是vector的vector,怎样reserve??
[code=C/C++]rnrntypedef vector VB;rnstruct MMrnrn VB vec;rn int x;rnrntypedef vector VA;rnrnint main()rnrn VA vmm;rn // 确知vmm最多只有10个元素,vmm.vec最多只有20个元素。rn 怎样一次性给vmm reserve足够的空间?既分配21*10个存储单元rnrnrnrn[/code]
C#中怎样给数组重新分配大小
刚学写了个猜数字的小游戏,在程序中我定义了一个10个元素的数组来存储用户猜过的数字,我想让程序运行时动态分配数组的大小,重新分配数组大小时保留原来的数组元素,应该怎么实现。请高手指点.......rn
如何使用vector的reserve和resize方法
reserve和resize是vector里两个很重要的方法,有效地使用这两个方法可以减少reallocate memory的次数,提高程序的性能,所以还是有必要去研究一下的,先来看一段简单的代码吧。stdafx.h[html] view plain copy// stdafx.h : include file for standard system include files,  // or p...
vector中 resize 和reserve(持续更新...)
C++ STL中vector内存用尽后,增长倍数为2倍;这样做的原因: 每次分配的新尺寸必然刚好大于之前分配的总和;但这样对缓存不太友好。若把增长倍数设置为1.5倍;这样做的原因:第N次扩容可以复用第N-1次扩容之前的释放的内存。C++标准中,并没有规定vector::push_back()用哪一个增长因子。这是由标准库的实现者决定的。常见的做法是增长为原来的两倍,libstd++里也是这样;但是...
vector迭代器
最近在因为项目需要,学习了vector容器,看了书上的一个小程序。程序如下:[code=c]#include "stdafx.h"rn#include rn#include rnrnint _tmain(int argc, _TCHAR* argv[])rn rn std::vector v;rnrn for(int i=1;i<=5;i++)rn v.push_back(i); rnrn for(auto& element : v)//不明白auto& element : v的意思;它是怎么判断循环结束的rn std::cout<
迭代器的失效
我们现要简单的理解一下std里面的迭代器,我们应该如何理解了。凭我自己最简单浅显目前的理解是迭代器就是提供遍历std容器的一个指针 在访问vector时候迭代器就像是一个连续的有地址的空间 假设末尾迭代器上我们在vector迭代器上删除pos位置,那么我们继续向后遍历没有了pos这个地址后面的地址空间就无法推到了。总而言之了,我脑海当中是这么想的。 好了,具体看一下吧,迭代器失效,我感觉耗时...
关于vector内存重新分配的问题?
我在看c++标准程序库的时候看到这样的描述:rnvector重新分配的时候,所有指向vector的ref,point和iterator失效。rnrn我自己的想法是,当vector请求新的内存空间以后,调用类型的拷贝构造函数,将所有数据复制到新的内存空间,并释放已有的空间,所以就都失效了。rnrn我写了一个函数来验证我的想法:rnrn//filernrn# include rn# include rnusing namespace std;rnrnint main()rnrn vector* iv= new vector;rn for(int i=0;i<5;++i)rn iv->push_back(i);rn vector* sv=iv;rn cout<<"before:"<push_back(1);rn cout<<"after:"<
Vector的迭代器
[size=18px]现在不想把迭代器初始化为begin或end。现在想初始化为第五个元素。怎么写。请以int数组为例[/size]
vector与迭代器
迭代器:迭代器是一种对象,它能够用来遍历STL容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上象迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。 头文件 #include 迭代器的意义:一句话“非常的方便”。 1.可以像指针一样,但是比指针更强大 2.在
vector的迭代器
vector的迭代器的相关使用问题,以及具体的例子
Vector中的resize()与reserve() 区别
clock_t start=clock(); rn for(int num=0;num<10000;++num) rn rn vector v1; rn for(int i=0;i<100;++i) rn v1.push_back(i); rn rn cout<<"直接push循环10000次用时:"< v2; rn v2.resize(100); rn for(int i=0;i<100;++i) rn v2.push_back(i); rn rn cout<<"先resize预设大小再push循环10000次用时:"< v3; rn v3.reserve(100); rn for(int i=0;i<100;++i) rn v3.push_back(i); rn rn cout<<"先reserve预设大小再push循环10000次用时:"<
vector reserve VS boost::pool
vector v;rn要从文件中读取数据存入vector,处理完之后clear再读取新数据处理。rn对于这个vector,reserve一定大小好,还是用boost::pool内存池分配好?
vector容器中resize与reserve的区别
Vector中的resize()与reserve()的区别 首先申明resize()和reserve()这两个成员函数都是Vector的公有成员函数(public  member function) 一、先了解vector容器的构成: 1.首先明白vector是一种顺序容器(申请的内部空间是连续的) 2.它的底层是由类模板实现的 二、这两个成员函数的意
vector中reserve函数的用法?
如下一个类:rnclass testrnrn int i;rnpublic:rn test(int j);rn test(const test &t);rn test();rn test & operator=(const test & t);rn void print();rn ~test(void);rn;rntest::test(int j)rnrn i = j;rn cout<<"Creating test"< v;rnv.reserve(5);rn rnfor(int i=0;i<5;i++)rnrn test t(i+1);rn v.push_back(t);rnrnrnvector va;rnva.reserve(5);rnfor(int i=0;i<5;i++)rnrn va[i] = v[i];rnrnfor(int i=0;i<5;i++)rnrn va[i].print();rn
为什么使用cin之后~ cin.getline就好像失效了?
int main ()rnrn float Length;rn const int NAME_LEN = 25;rn const int DATE_LEN = 25;rn char Name[NAME_LEN];rn char Date[DATE_LEN];rnrn cin.getline(Name, NAME_LEN);rn cin >> Length;rn cin.getline(Date, DATE_LEN);rn rn就像上面的程序~ 第一个个cin.getline能用~ 第二个就不能用了~
使用vector迭代器的一个现象
关于迭代器比较特殊的地方: vector<int> vec_int ; vec_int.push_back(1); vec_int.push_back(2); vec_int.push_back(3); vec_int.push_back(4); vec_int.push_back(5); vector<int>::iterator iter1;
vector容器的类型和迭代器使用
注意:for循环中使用“!=”来代替“&amp;lt;”符号进行条件判断。 vector是同一种类型的集合,使用时需要包含如下的头文件: #include&amp;lt;vector&amp;gt;  using std::vector; 1、vector可以保存系统的数据类型也可以保存自定义对象类型: vector&amp;lt;int&amp;gt; ivec;//ivec holds object of int . v...
vector中使用迭代器注意事项
1.使用iter++;和++iter;两种方式遍历的次数是相同的,但在STL中效率不同。前++返回引用,后++返回一个临时对象,因为iterator是类模板,使用 iter++这种形式要返回一个无用的临时对象,而it++是函数重载,所以编译器无法对其进行优化,所以每遍历一个元素,你就创建并销毁了一个无用的临时对象。 2.使用迭代器遍历时添加删除元素,可使用以下格式:for(iter = tria
vector使用erase函数之后iterator失效的问题
在一个vector中使用了两个iterator指向不同的位置,在对其中的一个使用erase之后另一个就失效了,请问各位大神有什么方案来解决这个问题?以下是部分代码rn[code=c]for (temp_it=head_it;temp_it!=cur_it;temp_it++) //head_it和cur_it指向vector的两个位置rn rn if (temp_it[0]==cur_it[0])rn rn temp_it=bag->queen.erase(temp_it); //断点检查显示执行此步骤后cur_it指向失效rn rn [/code]
C++之vector类型的使用和迭代器使用
注意:for循环中使用“!=”来代替“&amp;lt;”符号进行条件判断。vector是同一种类型的集合,使用时需要#include&amp;lt;vector&amp;gt;using std::vector;1、vector可以保存系统的数据类型也可以保存自定义对象类型:vector&amp;lt;int&amp;gt; ivec;//ivec holds object of int .vector&amp;lt;my_type&amp;gt; m...
没有躲过的坑--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有了resize函数还要提供一个reserve函数?
感觉reserve函数本身没有什么作用啊,reserve出来的空间并不能使用:rn vector vi;rn vi.reserve(3);rn //vi.resize(3);rn vi[2]=88;//程序在这里会崩溃。rnrn我在VC和GCC下面试了都不行。VC的源代码我查看了一下,reserve函数里面也调用到了alloc,而可以工作的resize函数反而不包含alloc调用,和我期待的相反。rn这是为什么呢? vector提供reserve这个函数,reserve出来的空间又不能用。那么什么时候需要reserve呢?rnrn我似乎觉得有resize就可以了呀。请指点!rn[code=C/C++]rn void reserve(size_type _Count)rn // determine new minimum length of allocated storagern if (max_size() < _Count)rn _Xlen(); // result too longrn else if (capacity() < _Count)rn // not enough room, reallocatern pointer _Ptr = this->_Alval.allocate(_Count);rnrn _TRY_BEGINrn _Umove(this->_Myfirst, this->_Mylast, _Ptr);rn _CATCH_ALLrn this->_Alval.deallocate(_Ptr, _Count);rn _RERAISE;rn _CATCH_ENDrnrn size_type _Size = size();rn if (this->_Myfirst != 0)rn // destroy and deallocate old arrayrn _Destroy(this->_Myfirst, this->_Mylast);rn this->_Alval.deallocate(this->_Myfirst,rn this->_Myend - this->_Myfirst);rn rnrn this->_Orphan_all();rn this->_Myend = _Ptr + _Count;rn this->_Mylast = _Ptr + _Size;rn this->_Myfirst = _Ptr;rn rn rnrn--------------------------------rnrn void resize(size_type _Newsize)rn // determine new length, padding with _Ty() elements as neededrn if (_Newsize < size())rn erase(begin() + _Newsize, end());rn else if (size() < _Newsize)rn // pad as neededrn _Reserve(_Newsize - size());rn _Uninitialized_default_fill_n(this->_Mylast, _Newsize - size(),rn (_Ty *)0, this->_Alval);rn this->_Mylast += _Newsize - size();rn rn rn[/code]
Ubuntu18.04 下重新分配根目录空大小
前几天刚在win10下装了个Ubuntu18.04双系统,看的是教程,那天给&quot;/&quot;(根目录)分配的是10G空间、2G的&quot;sawp&quot;(交换空间)、250MB的&quot;/boot&quot;引导空间,以及30G的&quot;/home&quot;用户空间。但是今天早上打开电脑发现里面Ubuntu提示内存不足了,一看根目录只剩下800M可用了!今晚有时间便搜了很多大佬的教程。并抽空记录下来。   先查看硬盘使用情况 :  df -lh...
js之json to string
我是代码JSON.parse(jsonstr); //可以将json字符串转换成json对象 JSON.stringify(jsonobj); //可以将json对象转换成json对符串
为什么Vector迭代器指向rbegin会报错?
std::vector::const_iterator itCycleDiscount ;rn if( stPrincingSecDiscont.vDiscount.rbegin()->nDiscountSeq == 1)rn rn itCycleDiscount = stPrincingSecDiscont.vDiscount.rbegin(); //此处报错rn //后面省略rn rn elsern rn //省略rn rn其中std::vector vDiscount是结构体stPricingSecDiscont中的成员,这段代码会在标记处报错。但是如果把rbegin()改为begin()就没有问题。小弟想请教一下为什么啊,搞不明白T Trn另外,if条件中的rbegin()就没有问题,所以我感觉可能就是迭代器指向rbegin()时出了不知道什么的问题。有谁能解释下么,感激不尽!!![img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/79.gif][/img]rn附报错信息:rnerror: no match for 'operator=' in 'itCycleDiscount = std::vector<_Tp, _Alloc>::rbegin() const [with _Tp = ocs::Discount_t, _Alloc = std::allocator]()'rn note: candidates are: __gnu_cxx::__normal_iterator > >&__gnu_cxx::__normal_iterator > >::operator=(const __gnu_cxx::__normal_iterator > >&)rn
Button使用位图之后失效…
在VC.net中Button设置位图,如下图:rn[img=http://hi.csdn.net/attachment/201106/6/7564414_13073371550d65.jpg][/img]rnrn代码如下:rnVERIFY(UserButton.AutoLoad(ID_User, this));rnVERIFY(TelButton.AutoLoad(ID_Tel, this));rnVERIFY(AboutButton.AutoLoad(ID_About, this));rnrnrn但运行之后Button控件失效,如下图:rnrn[img=http://hi.csdn.net/attachment/201106/6/7564414_1307337243yi1K.jpg][/img]rnrnrn请问各位大侠是什么问题:
Vector 中内存分配的问题( resize、reserve )
vector 内存分配、resize、reserve
C++ vector与数组区别 reserve与resize区别
vector是“动态”数组: 观察一个固定元素的地址变化: #include #include using namespace std; int main(int argc,char * argv[]) { vector myVec; cout << "size:" << myVec.size() << endl; cout << "capa
相关热词 c++和c#哪个就业率高 c# 批量动态创建控件 c# 模块和程序集的区别 c# gmap 截图 c# 验证码图片生成类 c# 再次尝试 连接失败 c#开发编写规范 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数