【发布时间】:2010-12-04 22:30:48
【问题描述】:
如果我在程序开始时使用resize() 和reserve() 将std::vector 分配给特定大小和容量,pop_back() 是否有可能“破坏”保留容量并导致重新分配?
【问题讨论】:
标签: c++ stl vector memory-management
如果我在程序开始时使用resize() 和reserve() 将std::vector 分配给特定大小和容量,pop_back() 是否有可能“破坏”保留容量并导致重新分配?
【问题讨论】:
标签: c++ stl vector memory-management
在 C++11 下,可以调用 shrink_to_fit() 来请求向量(以及双端队列或字符串),以便将保留空间减少到向量的容量。但是请注意,这取决于实现:它只是一个请求,并且没有任何保证。你可以试试下面的代码:
#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();
}
【讨论】:
这里是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(发布)的代码。所以它不会影响向量的容量(或重新分配)。
【讨论】:
没有。缩小向量容量的唯一方法是交换技巧
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()。
【讨论】:
pop_XXX 永远不会改变容量。如果您尝试推送超过容量允许的内容,push_XXX 可以更改容量。
【讨论】:
没有。与push_back 相同,pop_back 不会影响capacity()。它们只会影响size()。
编辑:
我应该说push_back不会改变v.size() < v.capacity()时的容量。
【讨论】:
没有。 pop_back() 不会缩小向量的容量。采用
std::vector<T>(v).swap(v) 代替。
【讨论】: