1、清空容器的模板函数(包括vector、list、deque等)
// 支持迭代器
template<typename T>
void clearContainer(T &arr)
{
T::iterator it;
for (it = arr.begin(); arr.end() != it; ) {
auto p = *it;
if (p) {
delete p;
p = nullptr;
}
it = arr.erase(it);
} // end for
}
// 另一种写法
template<typename T>
void clearContainer2(T &arr)
{
for (int i = 0; i < arr.size(); ++i) {
auto p = arr[i];
if (p) {
delete p;
p = nullptr;
}
} // end for
arr.clear();
}
2、测试代码
#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <deque>
#include <stack>
using namespace std;
void test1()
{
vector<int *> vecData;
list<int *> lstData;
deque<int *> deqData;
stack<int *> stackData;
for (int i = 1; i < 5; ++i) {
vecData.emplace_back(new int(i));
lstData.emplace_back(new int(i));
deqData.emplace_back(new int(i));
stackData.emplace(new int(i));
}
clearContainer(vecData);
clearContainer(lstData);
clearContainer(deqData);
//clearContainer(stackData); // stack不支持迭代器
int len1 = vecData.size();
int len2 = lstData.size();
int len3 = deqData.size();
int len4 = stackData.size();
char *log = new char[1024];
sprintf_s(log, 1024, "%d, %d, %d, %d", len1, len2, len3, len4);
cout << string(log) << endl;
delete [] log;
}
int _tmain(int argc, _TCHAR* argv[])
{
test1();
return 0;
}
3、运行结果
0, 0, 0, 4