如果我在程序开始时使用 resize()
和 reserve()
分配了特定大小和容量的 std::vector,那么是否有可能 pop_back()
会“破坏”保留的容量并导致重新分配?
如果我在程序开始时使用 resize()
和 reserve()
分配了特定大小和容量的 std::vector,那么是否有可能 pop_back()
会“破坏”保留的容量并导致重新分配?
不行。缩小向量容量的唯一方法是使用交换技巧。
template< typename T, class Allocator >
void shrink_capacity(std::vector<T,Allocator>& v)
{
std::vector<T,Allocator>(v.begin(),v.end()).swap(v);
}
甚至按照标准来说,也不能保证它能够正常工作。(虽然很难想象它不工作的情况。)
据我所知,下一个版本的C++标准(曾经的C++0x,现在成为C++1x)将拥有std::vector<>::shrink_to_fit()
函数。
在C++11中,可以调用shrink_to_fit()方法来请求将vector(以及deque或string)的保留空间减少到其容量。然而,请注意这是与实现相关的:它仅仅是一个请求,并没有任何保证。您可以尝试以下代码:
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> myVector;
for (auto i=1;i!=1e3;++i)
myVector.push_back(i);
cout << "Capacity: " << myVector.capacity() << endl;
myVector.reserve(2000);
cout << "Capacity (after reserving 2000): " << myVector.capacity() << endl;
myVector.shrink_to_fit();
cout << "Capacity (after shrink_to_fit): " << myVector.capacity();
}
不,pop_back() 不会减小 vector 的容量。可以使用 std::vector<T>(v).swap(v)
来实现。
pop_XXX不会改变容量。如果你试图推入超过容量限制的内容,push_XXX可以改变容量。
不会。与push_back
相同,pop_back
不会影响capacity()
,它们只会影响size()
。
编辑:
当v.size() < v.capacity()
时,我应该说push_back
不会改变容量。
这是std :: vector :: pop_back()函数的代码
void pop_back()
{ // erase element at end
if (!empty())
{ // erase last element
_Dest_val(this->_Alval, this->_Mylast - 1);
--this->_Mylast;
}
}
该函数只调用析构函数并将指针减少到最后一个元素。来自VC(Release)的代码。因此,它不会影响向量的容量(或重新分配)。