vector 的 reserve 和 capacity 是 C++ 中与内存管理相关的概念,但它们的含义和用途不同:
1. capacity(容量)
- 定义:当前
vector已分配的内存空间能够容纳的元素总数(即无需重新分配内存时,最多能存储的元素数量)。 - 特点:
capacity是自动管理的。当size()(当前元素数量)超过capacity时,vector会自动重新分配更大的内存(通常是双倍增长)。capacity永远不会小于size(),因为vector必须确保所有元素都有存储空间。capacity的值可以通过vector::capacity()获取。
2. reserve(预留空间)
- 定义:一个成员函数,用于手动请求
vector至少分配指定大小的内存空间。 - 特点:
reserve(n)会确保capacity() >= n,但不会改变size()(即不会添加或删除元素)。- 如果请求的
n小于当前capacity,reserve不会有任何操作(容量不会缩小)。 reserve的典型用途是预分配内存以避免多次自动扩容(例如已知需要存储大量元素时,提前reserve可提升性能)。
核心区别
| 特性 | capacity | reserve |
|---|---|---|
| 作用 | 表示当前分配的内存空间大小 | 手动请求至少分配指定大小的内存 |
| 是否自动调整 | 是(自动扩容) | 否(需显式调用) |
影响 size() | 不影响(size 由元素数量决定) | 不影响(仅改变容量,不改变元素) |
| 缩小容量 | 可能(通过 shrink_to_fit()) | 不支持(reserve 不减少容量) |
示例代码
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec;
std::cout << "Initial capacity: " << vec.capacity() << std::endl; // 0
vec.reserve(10);
std::cout << "After reserve(10): capacity=" << vec.capacity()
<< ", size=" << vec.size() << std::endl; // capacity=10, size=0
vec.push_back(1);
std::cout << "After push_back(1): capacity=" << vec.capacity()
<< ", size=" << vec.size() << std::endl; // capacity=10, size=1
vec.reserve(5); // 无操作(容量不会缩小)
std::cout << "After reserve(5): capacity=" << vec.capacity() << std::endl; // 10
}
总结
capacity是当前内存分配的状态,由vector自动管理。reserve是优化手段,用于预分配内存,避免频繁扩容带来的性能损耗。
1402

被折叠的 条评论
为什么被折叠?



