在使用 STL 容器时,往往使用 clear
成员函数清空其内容。然而,它可能不会实际释放容器使用的内存空间 (而是将其保留以供后续使用),在一些情况下可能导致超出题目的内存限制。
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> v;
v.resize(114514);
cout << v.capacity() << '\n'; // 114514
v = {};
cout << v.capacity() << '\n'; // 114514
v = vector<int>();
cout << v.capacity() << '\n'; // 114514 with C++ 98, 0 with C++ >= 11
{
vector<int> empty;
v.swap(empty);
}
cout << v.capacity() << '\n'; // 0
}
如果看到了 MLE,要考虑这种可能性。
另外,内存超限时,评测结果也可能为 RE (DOMJudge 就只有 RE,没有 MLE),因此也要考虑这种可能性。
首先,对于 的题目,使用 clear
都不会导致任何问题,因此下面的内容仅在你确认需要彻底释放容器占用的内存才能避免 MLE 时适用。如果碰到什么题都彻底释放容器,可能反而导致 TLE。
如果希望彻底释放一个容器占用的空间,对于 C++11 及以上,最简单的方法是直接构造一个空容器并 (移动) 赋值给该容器。对于 C++98,则不得不写一个非常古怪的 swap
操作。
建议严格控制容器的生存期,尽量把 STL 容器定义成非静态局部变量,这样在它生存期结束时,其空间就会被自动释放。