永发信息网

C++标准库assign()

答案:2  悬赏:20  手机版
解决时间 2021-04-30 19:06
  • 提问者网友:难遇难求
  • 2021-04-30 15:43

以下是一段代码:

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中, 释放原先的内存再分配与一样大的内存, 这不是做无聊的费事,标准库是怎么做的????

最佳答案
  • 五星知识达人网友:笑迎怀羞
  • 2021-04-30 17:10

不知道你是用那个工具,我用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();
}

全部回答
  • 1楼网友:人间朝暮
  • 2021-04-30 18:11

我来简单的解释一下吧:

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

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

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

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

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

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

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯