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
是优化手段,用于预分配内存,避免频繁扩容带来的性能损耗。