C++ <vector> capacity 函数
capacity 是 vector 中用于查询容量的函数,它返回容器当前分配的存储空间大小。
capacity 是容器类的成员函数,用于返回容器当前分配的存储空间能够容纳的元素数量。这个值通常大于或等于 size()。
capacity 反映了 vector 内部预分配的内存空间,理解它有助于优化程序性能和避免不必要的内存重新分配。
单词释义: capacity 表示"容量",即容器能够容纳元素的数量。
基本语法与参数
capacity 是容器类的成员函数,调用它不需要参数。
语法格式
size_type capacity() const;
参数说明
- 参数: 无参数
capacity不接受任何参数。
函数说明
- 返回值: 返回
size_type类型(通常是size_t),表示容器当前分配的存储空间能够容纳的元素数量。 - 效果: 返回一个非负整数,表示容器已分配的内存空间。
- 注意:
capacity()返回的是容量,不是元素个数。元素个数使用size()获取。
实例
让我们通过一系列例子,彻底掌握 capacity 的用法。
示例 1:基础用法 - 查看容量
实例
#include <iostream>
#include <vector>
int main() {
// 空 vector
std::vector<int> emptyVec;
std::cout << "空 vector - size: " << emptyVec.size()
<< ", capacity: " << emptyVec.capacity() << std::endl;
// 有元素的 vector
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::cout << "5 元素 vector - size: " << numbers.size()
<< ", capacity: " << numbers.capacity() << std::endl;
return 0;
}
#include <vector>
int main() {
// 空 vector
std::vector<int> emptyVec;
std::cout << "空 vector - size: " << emptyVec.size()
<< ", capacity: " << emptyVec.capacity() << std::endl;
// 有元素的 vector
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::cout << "5 元素 vector - size: " << numbers.size()
<< ", capacity: " << numbers.capacity() << std::endl;
return 0;
}
运行结果预期:
空 vector - size: 0, capacity: 0 5 元素 vector - size: 5, capacity: 5
代码解析:
- 空 vector 的
capacity()是 0。 - 有 5 个元素的 vector,
capacity()至少是 5(可能更大,取决于实现)。
示例 2:size 与 capacity 的关系
理解 size 和 capacity 的区别是优化 vector 使用的基础。
实例
#include <iostream>
#include <vector>
int main() {
std::vector<int> v;
// 逐渐添加元素,观察容量变化
std::cout << "添加元素过程中 size 和 capacity 的变化:" << std::endl;
for(int i = 0; i < 15; ++i) {
v.push_back(i);
std::cout << "添加 " << (i + 1) << " 个元素后 - size: "
<< v.size() << ", capacity: " << v.capacity() << std::endl;
}
return 0;
}
#include <vector>
int main() {
std::vector<int> v;
// 逐渐添加元素,观察容量变化
std::cout << "添加元素过程中 size 和 capacity 的变化:" << std::endl;
for(int i = 0; i < 15; ++i) {
v.push_back(i);
std::cout << "添加 " << (i + 1) << " 个元素后 - size: "
<< v.size() << ", capacity: " << v.capacity() << std::endl;
}
return 0;
}
运行结果预期(典型输出):
添加元素过程中 size 和 capacity 的变化: 添加 1 个元素后 - size: 1, capacity: 1 添加 2 个元素后 - size: 2, capacity: 2 添加 3 个元素后 - size: 3, capacity: 4 添加 4 个元素后 - size: 4, capacity: 4 添加 5 个元素后 - size: 5, capacity: 8 添加 6 个元素后 - size: 6, capacity: 8 添加 7 个元素后 - size: 7, capacity: 8 添加 8 个元素后 - size: 8, capacity: 8 添加 9 个元素后 - size: 9, capacity: 16 添加 10 个元素后 - size: 10, capacity: 16 添加 11 个元素后 - size: 11, capacity: 16 添加 12 个元素后 - size: 12, capacity: 16 添加 13 个元素后 - size: 13, capacity: 16 添加 14 个元素后 - size: 14, capacity: 16 添加 15 个元素后 - size: 15, capacity: 16
代码解析:
- vector 的容量以指数方式增长(通常是 2 倍)。
- 当容量不足时,vector 会分配更大的内存空间(通常是当前容量的 2 倍)。
- 这种策略是为了减少内存重新分配的次数,提高性能。
示例 3:使用 reserve 预分配容量
使用 reserve 可以预先分配足够的容量,避免频繁的内存重新分配。
实例
#include <iostream>
#include <vector>
int main() {
// 预分配 1000 个元素的容量
std::vector<int> v;
v.reserve(1000);
std::cout << "reserve(1000) 后 - size: " << v.size()
<< ", capacity: " << v.capacity() << std::endl;
// 添加 100 个元素
for(int i = 0; i < 100; ++i) {
v.push_back(i);
}
std::cout << "添加 100 个元素后 - size: " << v.size()
<< ", capacity: " << v.capacity() << std::endl;
return 0;
}
#include <vector>
int main() {
// 预分配 1000 个元素的容量
std::vector<int> v;
v.reserve(1000);
std::cout << "reserve(1000) 后 - size: " << v.size()
<< ", capacity: " << v.capacity() << std::endl;
// 添加 100 个元素
for(int i = 0; i < 100; ++i) {
v.push_back(i);
}
std::cout << "添加 100 个元素后 - size: " << v.size()
<< ", capacity: " << v.capacity() << std::endl;
return 0;
}
运行结果预期:
reserve(1000) 后 - size: 0, capacity: 1000 添加 100 个元素后 - size: 100, capacity: 1000
代码解析:
reserve(1000)预先分配了能容纳 1000 个元素的内存空间。- 添加 100 个元素后,
capacity仍然是 1000,没有发生内存重新分配。 - 这可以显著提高性能,特别是当需要添加大量元素时。
示例 4:shrink_to_fit 释放多余容量
C++11 引入了 shrink_to_fit 方法,可以将容量调整为与 size 相同。
实例
#include <iostream>
#include <vector>
int main() {
std::vector<int> v;
// 添加 5 个元素
for(int i = 0; i < 5; ++i) {
v.push_back(i);
}
std::cout << "初始状态 - size: " << v.size()
<< ", capacity: " << v.capacity() << std::endl;
// 预留更多空间
v.reserve(100);
std::cout << "reserve(100) 后 - size: " << v.size()
<< ", capacity: " << v.capacity() << std::endl;
// 收缩到合适大小
v.shrink_to_fit();
std::cout << "shrink_to_fit() 后 - size: " << v.size()
<< ", capacity: " << v.capacity() << std::endl;
return 0;
}
#include <vector>
int main() {
std::vector<int> v;
// 添加 5 个元素
for(int i = 0; i < 5; ++i) {
v.push_back(i);
}
std::cout << "初始状态 - size: " << v.size()
<< ", capacity: " << v.capacity() << std::endl;
// 预留更多空间
v.reserve(100);
std::cout << "reserve(100) 后 - size: " << v.size()
<< ", capacity: " << v.capacity() << std::endl;
// 收缩到合适大小
v.shrink_to_fit();
std::cout << "shrink_to_fit() 后 - size: " << v.size()
<< ", capacity: " << v.capacity() << std::endl;
return 0;
}
运行结果预期:
初始状态 - size: 5, capacity: 5 reserve(100) 后 - size: 5, capacity: 100 shrink_to_fit() 后 - size: 5, capacity: 5
代码解析:
shrink_to_fit()请求容器将容量减少到与 size 相同。- 这可以释放不再需要的内存。
- 注意:这不是强制要求,具体的容量取决于实现。
示例 5:capacity 的实际应用
了解 capacity 可以帮助优化内存使用。
实例
#include <iostream>
#include <vector>
void printStatus(const std::string& operation,
const std::vector<int>& v) {
std::cout << operation << " - size: " << v.size()
<< ", capacity: " << v.capacity() << std::endl;
}
int main() {
std::vector<int> data;
printStatus("初始状态", data);
// 如果我们知道需要存储 1000 个元素,可以预先分配
const size_t estimatedSize = 1000;
data.reserve(estimatedSize);
printStatus("reserve(1000) 后", data);
// 模拟数据加载
for(size_t i = 0; i < 1000; ++i) {
data.push_back(static_cast<int>(i));
}
printStatus("添加 1000 个元素后", data);
// 检查是否需要扩容
if(data.capacity() < estimatedSize) {
std::cout << "警告:容量不足!" << std::endl;
} else {
std::cout << "容量充足,内存分配次数最少化" << std::endl;
}
return 0;
}
#include <vector>
void printStatus(const std::string& operation,
const std::vector<int>& v) {
std::cout << operation << " - size: " << v.size()
<< ", capacity: " << v.capacity() << std::endl;
}
int main() {
std::vector<int> data;
printStatus("初始状态", data);
// 如果我们知道需要存储 1000 个元素,可以预先分配
const size_t estimatedSize = 1000;
data.reserve(estimatedSize);
printStatus("reserve(1000) 后", data);
// 模拟数据加载
for(size_t i = 0; i < 1000; ++i) {
data.push_back(static_cast<int>(i));
}
printStatus("添加 1000 个元素后", data);
// 检查是否需要扩容
if(data.capacity() < estimatedSize) {
std::cout << "警告:容量不足!" << std::endl;
} else {
std::cout << "容量充足,内存分配次数最少化" << std::endl;
}
return 0;
}
运行结果预期:
初始状态 - size: 0, capacity: 0 reserve(1000) 后 - size: 0, capacity: 1000 添加 1000 个元素后 - size: 1000, capacity: 1000 容量充足,内存分配次数最少化
代码解析:
- 预先估计需要的容量并使用
reserve可以避免多次内存分配。 - 这对于处理大量数据的场景特别有用。

C++ 容器类 <vector>