永发信息网

C++标准库assign()

答案:2  悬赏:20  手机版
解决时间 2021-04-30 19:06

以下是一段代码:

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清空,然后在插入,所以,导致全部失效,但没有引起内存重新分配

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
对于一个普通的打工仔,追求一个美丽的大学生
取名为嘉杙好不好,是什么意思
旺兴五金店这个地址在什么地方,我要处理点事
万花筒怎样开通十元?
火影鸣人的忍术
为什么人是好动的动物?
黄金柚好吃吗
怎样使自己的婚姻生活有趣一些?
宁波全雍城烧烤如何坐公交去??
炫舞中35级 领的 工资是多少
请问电脑的主板应该选什么样的。好用一些啊?
为什么我把校友里的人删了别人还能偷我菜?
钢琴黑白键各有多少个?
N79为什么搜索不到别人的蓝牙设备?
通宵为什么那么累啊
推荐资讯
8090被淘汰后还是一个组合吗?他们会走散吗?
超级QQ为什么要上3G和手机QQ才能加速?
《米娜》杂志里有哪些内容?
怎么在手机上把歌曲和歌词关联起来?
结婚后和男方父母不和该怎么办
从0开始,怎么学服装设计?
我喜欢的人她却别人我怎么办?
天龙八部峨眉是不是学了九阴真经那本心法就有
现在有没有新出的游戏啊?
快乐男声李行亮在8进7中演唱了什么歌
平顶山市哪里有组装电脑的
手机QQ的财付通如何付款?需要用电脑操作吗?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?