为什么vector有了resize函数还要提供一个reserve函数?
感觉reserve函数本身没有什么作用啊,reserve出来的空间并不能使用:
vector<int> vi;
vi.reserve(3);
//vi.resize(3);
vi[2]=88;//程序在这里会崩溃。
我在VC和GCC下面试了都不行。VC的源代码我查看了一下,reserve函数里面也调用到了alloc,而可以工作的resize函数反而不包含alloc调用,和我期待的相反。
这是为什么呢? vector提供reserve这个函数,reserve出来的空间又不能用。那么什么时候需要reserve呢?
我似乎觉得有resize就可以了呀。请指点!
void reserve(size_type _Count) { // determine new minimum length of allocated storage if (max_size() < _Count) _Xlen(); // result too long else if (capacity() < _Count) { // not enough room, reallocate pointer _Ptr = this->_Alval.allocate(_Count); _TRY_BEGIN _Umove(this->_Myfirst, this->_Mylast, _Ptr); _CATCH_ALL this->_Alval.deallocate(_Ptr, _Count); _RERAISE; _CATCH_END size_type _Size = size(); if (this->_Myfirst != 0) { // destroy and deallocate old array _Destroy(this->_Myfirst, this->_Mylast); this->_Alval.deallocate(this->_Myfirst, this->_Myend - this->_Myfirst); } this->_Orphan_all(); this->_Myend = _Ptr + _Count; this->_Mylast = _Ptr + _Size; this->_Myfirst = _Ptr; } }-------------------------------- void resize(size_type _Newsize) { // determine new length, padding with _Ty() elements as needed if (_Newsize < size()) erase(begin() + _Newsize, end()); else if (size() < _Newsize) { // pad as needed _Reserve(_Newsize - size()); _Uninitialized_default_fill_n(this->_Mylast, _Newsize - size(), (_Ty *)0, this->_Alval); this->_Mylast += _Newsize - size(); } }
vector<int> v;for(int i=0; i<100000; ++i) v.push_back(i);