理解C++ STL容器中capacity与size的区别对性能优化至关重要,因为size表示当前元素数量,capacity表示已分配内存能容纳的最大元素数。当size超过capacity时,容器会触发重新分配,导致昂贵的内存拷贝操作,尤其在vector和string等连续内存容器中影响显著。通过reserve()预先分配内存可避免频繁重分配,shrink_to_fit()可释放多余容量,而swap技巧能彻底清空内存。capacity概念主要适用于vector和string这类连续存储容器,list、map等非连续存储容器则无此概念。合理使用这些策略可有效提升程序性能并减少资源浪费。

在我看来,C++ STL容器中的
capacity
size
size
capacity
当我们谈论C++ STL容器的
capacity
size
std::vector
std::string
size
std::vector<int> v; v.push_back(1); v.push_back(2);
v.size()
capacity
想象一下,你在一个房间里放东西。
size
capacity
size
capacity
std::vector
size
capacity
push_back
size
size
capacity
vector
立即学习“C++免费学习笔记(深入)”;
所以,
size <= capacity
capacity
push_back
vector
push_back
在我看来,理解
capacity
size
std::vector
capacity
核心问题在于“重新分配”。每次
vector
举个例子,假设你有一个
vector<MyObject>
MyObject
reserve
capacity
MyObject
通过合理地使用
reserve()
vector
push_back
size
capacity
#include <vector>
#include <iostream>
int main() {
std::vector<int> numbers;
std::cout << "初始状态: size = " << numbers.size() << ", capacity = " << numbers.capacity() << std::endl;
numbers.push_back(1);
std::cout << "添加1个元素后: size = " << numbers.size() << ", capacity = " << numbers.capacity() << std::endl;
numbers.push_back(2);
std::cout << "添加2个元素后: size = " << numbers.size() << ", capacity = " << numbers.capacity() << std::endl;
// 假设此时capacity变为2,size也为2
numbers.push_back(3); // 此时很可能发生重新分配
std::cout << "添加3个元素后: size = " << numbers.size() << ", capacity = " << numbers.capacity() << std::endl;
std::vector<int> optimized_numbers;
optimized_numbers.reserve(100); // 预留100个元素的空间
std::cout << "预留100空间后: size = " << optimized_numbers.size() << ", capacity = " << optimized_numbers.capacity() << std::endl;
for (int i = 0; i < 50; ++i) {
optimized_numbers.push_back(i); // 这50次push_back不会发生重新分配
}
std::cout << "添加50个元素后: size = " << optimized_numbers.size() << ", capacity = " << optimized_numbers.capacity() << std::endl;
return 0;
}这段代码清晰地展示了
reserve()
capacity
std::vector
capacity
capacity
std::vector
capacity
capacity
std::string
std::string
char
std::vector
size()
capacity()
没有capacity
std::list
std::list
list
size()
capacity()
std::map
std::set
std::multimap
std::multiset
capacity
std::unordered_map
std::unordered_set
vector
capacity
rehash
capacity()
rehash
bucket_count()
vector
capacity
std::deque
std::deque
deque
capacity()
vector
所以,当我们思考
capacity
vector
string
有效地管理STL容器的容量,特别是对于
std::vector
std::string
预先分配(reserve()
reserve()
std::vector<int> data;
data.reserve(10000); // 预计会存储10000个元素
for (int i = 0; i < 10000; ++i) {
data.push_back(i); // 避免了至少大部分的重新分配
}这样做的好处是显而易见的:减少了大量的内存分配、数据拷贝和释放操作,从而显著提升性能。特别是在循环中频繁添加元素时,
reserve()
收缩容量(shrink_to_fit()
capacity
size
shrink_to_fit()
capacity
size
std::vector<int> large_data;
large_data.reserve(100000); // 预分配大量空间
for (int i = 0; i < 10000; ++i) {
large_data.push_back(i);
}
// ... 某些操作后,只剩下少量数据
large_data.erase(large_data.begin() + 100, large_data.end()); // 删除了大部分元素
std::cout << "删除后: size = " << large_data.size() << ", capacity = " << large_data.capacity() << std::endl;
large_data.shrink_to_fit(); // 尝试释放多余内存
std::cout << "shrink_to_fit后: size = " << large_data.size() << ", capacity = " << large_data.capacity() << std::endl;需要注意的是,
shrink_to_fit()
清空容器的内存(swap()
capacity
clear()
size
capacity
swap
std::vector<int> my_vector = {1, 2, 3, 4, 5};
// ... 填充大量数据,让capacity很大
std::cout << "清空前: size = " << my_vector.size() << ", capacity = " << my_vector.capacity() << std::endl;
std::vector<int>().swap(my_vector); // 交换后,my_vector变为空,且capacity也为0
std::cout << "清空后: size = " << my_vector.size() << ", capacity = " << my_vector.capacity() << std::endl;这个技巧利用了
swap
避免不必要的拷贝: 在C++11及更高版本中,利用右值引用和移动语义(
std::move
emplace_back()
push_back()
emplace_back()
struct MyObject {
int id;
// 假设MyObject的拷贝构造函数很耗时
MyObject(int i) : id(i) { std::cout << "构造 MyObject(" << id << ")" << std::endl; }
MyObject(const MyObject& other) : id(other.id) { std::cout << "拷贝构造 MyObject(" << id << ")" << std::endl; }
MyObject(MyObject&& other) noexcept : id(other.id) { std::cout << "移动构造 MyObject(" << id << ")" << std::endl; }
};
std::vector<MyObject> objects;
objects.reserve(2); // 预留空间
std::cout << "使用push_back(MyObject(1)):" << std::endl;
objects.push_back(MyObject(1)); // 触发移动构造
std::cout << "使用emplace_back(2):" << std::endl;
objects.emplace_back(2); // 直接在容器内部构造emplace_back
管理
capacity
以上就是C++STL容器容量capacity与大小size区别的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号