【C/C++ STL:vector如何释放空间?】

在C++中,std::vector 是一个动态数组,它能够根据需要自动地调整其大小。当你向 vector 中添加元素时,如果当前分配的内存不足以存储所有元素,vector 会自动重新分配更大的内存空间,并将旧元素复制(或移动,取决于C++版本和编译器优化)到新的内存区域。然而,vector 并不直接提供一个成员函数来“释放”其已分配但未使用的空间(即,减小其容量到当前大小或更小)。但是,你可以通过几种方式间接地实现这一目的。

使用 swap 技巧

如果你想减小 vector 的容量到其当前大小(即,只保留已使用的空间),你可以通过创建一个临时 vector 并使用 swap 成员函数来实现:

#include <vector>  
#include <algorithm> // 用于 std::move_if_noexcept(可选)  
  
std::vector<int> vec;  
// ... 填充 vec ...  
  
// 创建一个新的临时 vector,它的大小等于 vec 的当前大小  
std::vector<int>(vec).swap(vec);  
  
// 或者,在 C++11 及更高版本中,使用 std::move 来避免不必要的复制  
std::vector<int>().swap(vec);  
  
// 此时,vec 的容量被减小到其当前大小

注意:std::vector(vec) 创建了一个 vec 的副本,但因为是临时的,它会在 swap 之后被销毁,这时 vec 就拥有了这个临时 vector 的容量,即其当前大小。

使用 shrink_to_fit(C++11及以后)

从C++11开始,std::vector 提供了一个成员函数 shrink_to_fit,它请求容器减少其容量以匹配其大小。但请注意,这是一个请求,而不是保证:

#include <vector>  
  
std::vector<int> vec;  
// ... 填充 vec ...  
  
vec.shrink_to_fit();  
  
// vec 的容量可能会减小到其当前大小,但这并不是强制的

实现可能会因为性能考虑而忽略这个请求,特别是在重新分配成本较高的情况下。因此,shrink_to_fit 的效果可能依赖于具体的编译器和标准库实现。

总结

  1. 如果你确实需要释放 vector 分配但未使用的空间,可以尝试使用 swap 技巧或 shrink_to_fit(如果可用并适用)。
  2. swap 技巧是强制性的,但可能会引入额外的性能开销(尤其是当 vector 很大时)。
  3. shrink_to_fit 是请求性的,其效果可能因编译器和标准库的不同而有所不同。
  4. 在大多数情况下,让 vector 管理其内存通常是最好的选择,因为这样可以简化代码并可能提高性能。
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flos chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值