Fra*_*ank 8 c++ stl vector capacity
我想'缩小'适合' std::vector,将其容量减小到精确的大小,以便释放额外的内存.标准技巧似乎是这里描述的:
template< typename T, class Allocator >
void shrink_capacity(std::vector<T,Allocator>& v)
{
std::vector<T,Allocator>(v.begin(),v.end()).swap(v);
}
Run Code Online (Sandbox Code Playgroud)
缩小到适合的全部意义是节省内存,但是这种方法首先不创建深层副本然后交换实例吗?所以在某些时候 - 构建副本时 - 内存使用量是否翻了一倍?
如果是这种情况,是否有一种更符合记忆的缩小方法?(在我的情况下,矢量非常大,我无法承受原始内容以及随时在内存中的副本.)
那么,如果你想调整数组的大小,你会怎么做?您必须创建一个新值并复制所有值 - 无论是单独复制还是使用 memcpy 或其他方式复制。在 C 或 C++ 中,您无法真正调整数组的大小。
std::vector几乎可以保证使用数组来实现存储(IIRC,标准不保证它是一个数组,但数组是唯一可以满足 API 的各种要求的东西,例如每个操作必须有多高效;因此,实际上,即使该保证不明确,它也是有保证的)。由于它是使用数组实现的,并且您无法在不复制的情况下调整数组的大小,因此您无法在不复制的情况下调整向量的大小。
理论上,您可以有一个shrink_capacity()函数来隐藏您必须暂时或多或少加倍其大小要求的事实,但由于std::vector目前没有这样的函数,因此您实际上必须制作一个显式副本。交换技巧就是一个很好的方法。
如果在这种情况下你真的关心内存,你可以做的是使用指针(或智能指针)而不是让向量直接保存对象。这可能并不完全理想,但它会减少您的内存需求。