使用 swap
函数收缩 vector
内存
在 C++ 中,vector
是一个非常有用的容器,但有时我们可能需要收缩它的内存占用。特别是当我们从一个大的 vector
中截取一部分数据后,原始 vector
的内存可能会变得过大。这时,我们可以使用 swap
函数来有效地收缩内存。
原理
- 首先,我们创建一个匿名的
vector
,将原始vector
的值复制给这个匿名的vector
。 - 接下来,我们将这个匿名的
vector
与原始vector
互换。这样,原始vector
的容量和大小都会变为我们截取后的大小。 - 最后,系统会回收匿名的
vector
,完成内存收缩。
示例代码
#include <iostream>
#include <vector>
void shrinkVectorMemory() {
std::vector<int> v1;
for (int i = 0; i < 100000; ++i) {
v1.push_back(i);
}
std::cout << "v1的容量为:" << v1.capacity() << std::endl;
std::cout << "v1的大小为:" << v1.size() << std::endl;
v1.resize(3);
std::cout << "v1的容量为:" << v1.capacity() << std::endl;
std::cout << "v1的大小为:" << v1.size() << std::endl;
// 使用 swap 函数收缩内存
std::vector<int>(v1).swap(v1);
std::cout << "收缩内存后:" << std::endl;
std::cout << "v1的容量为:" << v1.capacity() << std::endl;
std::cout << "v1的大小为:" << v1.size() << std::endl;
}
int main() {
shrinkVectorMemory();
return 0;
}
使用 shrink_to_fit
成员函数
在 C++11 及以后的版本中,我们也可以直接使用 shrink_to_fit
成员函数来达到相同的目的:
void shrinkVectorMemory() {
std::vector<int> v1;
for (int i = 0; i < 100000; ++i) {
v1.push_back(i);
}
std::cout << "v1的容量为:" << v1.capacity() << std::endl;
std::cout << "v1的大小为:" << v1.size() << std::endl;
v1.resize(3);
std::cout << "v1的容量为:" << v1.capacity() << std::endl;
std::cout << "v1的大小为:" << v1.size() << std::endl;
// 使用 shrink_to_fit 成员函数收缩内存
v1.shrink_to_fit();
std::cout << "收缩内存后:" << std::endl;
std::cout << "v1的容量为:" << v1.capacity() << std::endl;
std::cout << "v1的大小为:" << v1.size() << std::endl;
}
int main() {
shrinkVectorMemory();
return 0;
}