如果我在程序开头使用resize()
和reserve()
将std :: vector分配到一定的大小和容量,那么pop_back()
可能会“破坏”保留容量并导致重新分配?
答案 0 :(得分:18)
没有。缩小矢量容量的唯一方法是交换技巧
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()
。
答案 1 :(得分:4)
没有。 pop_back()不会缩小向量的容量。使用
而是std::vector<T>(v).swap(v)
。
答案 2 :(得分:4)
在C ++ 11下,可以调用shrink_to_fit()来请求向量(以及deque或字符串),以便将保留空间减少到向量的容量。但请注意,这取决于实现:它只是一个请求,并且无法保证。您可以尝试以下代码:
#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();
}
答案 3 :(得分:2)
pop_XXX永远不会改变容量。 push_XXX可以改变容量,如果你尝试推送的东西超过容量允许的数量。
答案 4 :(得分:1)
NO。与push_back
相同,pop_back
不会影响capacity()
。它们只影响size()
。
编辑:
我应该说push_back
时v.size() < v.capacity()
不会改变容量。
答案 5 :(得分:1)
这是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(发布)的代码。因此它不会影响向量的容量(或重新分配)。