永发信息网

c++标准库

答案:2  悬赏:0  手机版
解决时间 2021-07-18 06:05

vector<int> ivec1(100);

vector<int> ivec2(10, 10);

vector<int>:: const_iterator = ivec1.begin();

ivec1 = ivec2,

此时输出的ivec1.size() = 10, ivec.capcaity() = 100;

但是*iterator 是失效的,说明ivec1 释入了原先的内存再分配与原先一样的内存, 再将ivec2拷到ivec1中, 释放原先的内存再分配与一样大的内存, 这不是做无聊的费事,标准库是怎么做的????

最佳答案

不知道你是用那个工具,我用VC 2003运行结果跟你说的不一样;


代码:


vector<int> ivec1(100);



vector<int> ivec2(10, 10);
vector<int>:: const_iterator it = ivec1.begin();
ivec1 = ivec2;
cout<<ivec1.size()<<","<<ivec1.capacity()<<endl;
cout<<(*it)<<endl;


输出:


10,100


10


说明it是有效的,而且等于10;



以下是VC 2003 拷贝函数的源代码,并没有你说的释入了原先的内存再分配与原先一样的内存.


_Myt& operator=(const _Myt& _Right)
{ // assign _Right
if (this != &_Right)
{ // worth doing



if (_Right.size() == 0)
clear(); // new sequence empty, free storage
else if (_Right.size() <= size())
{ // enough elements, copy new and destroy old
pointer _Ptr = copy(_Right._Myfirst, _Right._Mylast,
_Myfirst); // copy new
_Destroy(_Ptr, _Mylast); // destroy old
_Mylast = _Myfirst + _Right.size();
}
else if (_Right.size() <= capacity())
{ // enough room, copy and construct new
pointer _Ptr = _Right._Myfirst + size();
copy(_Right._Myfirst, _Ptr, _Myfirst);
_Mylast = _Ucopy(_Ptr, _Right._Mylast, _Mylast);
}
else
{ // not enough room, allocate new array and construct new
if (_Myfirst != 0)
{ // discard old array
_Destroy(_Myfirst, _Mylast);
this->_Alval.deallocate(_Myfirst, _Myend - _Myfirst);
}
if (_Buy(_Right.size()))
_Mylast = _Ucopy(_Right._Myfirst, _Right._Mylast,
_Myfirst);
}
}
return (*this);
}




////////////////////////////////////////////////////////////////////////////////////////////////


{ // enough elements, copy new and destroy old
pointer _Ptr = copy(_Right._Myfirst, _Right._Mylast,
_Myfirst); // copy new
_Destroy(_Ptr, _Mylast); // destroy old///////////////////////////////只释放了多余的空间
_Mylast = _Myfirst + _Right.size();
}

全部回答

我来简单的解释一下吧:

首先,确切地说,vector是标准模版库(STL)里的,而不是标准库

其次,在你给出的程序当中,并不像你说的那样,其实,ivec1的内存位置没有改变,还是那一块,除非ivec2的size超过的ivec1的capacity,他才会触发realloc。你会出现这种疑问原因只有一点:你把迭代器当成指针了。

值得注意的是,迭代器有指针的功能,但他不是指针,当对容器进行了插入删除操作的时候,会导致部分或全部迭代器的失效。你可以做个实验,定义个把ivec1=ivec2去掉,改成ivec1.push_back(9); 这样,你的指向第一个元素的迭代器同样会失效。

如果你是插入,insert或者push_back什么的,那么全部迭代器失效,因为他不能确定是否插入元素后会进行内存的重新分配

如果你是删除,pop_back或者erase什么的,那么当前元素及其后的迭代器全部失效

你的那个赋值操作,其实是相当于把ivec1清空,然后在插入,所以,导致全部失效,但没有引起内存重新分配

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
武汉哪里有卖网球的?
为什么我不会起豆豆呢?
有多少人是临要结婚了,却想要分手的?
什么原因引起长斑,怎样把斑洗掉
地下城开宠物现在还有什么决窍没?
动作类电影求荐
什么隔离霜保湿效果好,适合敏感性肌肤?
帮忙咯 YY上能发的喜糖 急咯 就是符号组成的
脑筋急转弯:一个圆有几个面?
数码相机哪种牌子的可以呢?
魔兽世界XS带人JT多少G,WQ多少G?
老姐结婚送什么礼物最好?
NBA中特戈格鲁在哪支球队?
如果爱一个人爱她爱到无法自拔爱到无可救药那
人能活到175岁吗?
推荐资讯
我刚开通QQ会员几天,怎么领不到CF和丝路英雄
你认为什么叫优秀什么叫完美?
问一个老地名,老地名叫江西清江县州尚公社大
什么样的井让人害怕
超级QQ刚刚开通但10多天就取消了 在这个月剩
和黄昏在美 终要天黑相近的一句
速求!手机怎么开钻!!!
为什么代码不能叠加使用
手都冷红了杂整啊?
请问:知道一个人的名字可以查出她的地址吗!不
阅换黄金AK的卡片一定要马上换吗
怎么样才能让胃不再疼?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?