原型:
#include <vector>
void clear();
函数clear()删除储存在vector中的所有元素. 如果vector的元素是一些object, 则它将为当前储存的每个元素调用它们各自的析构函数(destructor). 然而, 如果vector储存的是指向对象的指针, 此函数并不会调用到对应的析构函数. 在第二种情况下, 为了完全删除vector中的元素则应使用一个类似于下的循环:
调用clear之后, vector的尺寸(size)将变成zero. 但它的容量(capacity)却并不发生变化, vector本身并不释放任何内存.
如果你想同时做到清空vector的元素和释放vector的容量, 你可以使用swap技巧(此技巧并非在所有环境中都管用 e.g. not with Intel Compiler 10.0.69 and LINUX 2.6.9-89 x64):
这样做会创建一个临时的空vector, 它将替换希望清空的vector.
clear()以线性时间linear time运行.
以vector::clear()为例:
#include<iostream>
#include <vector>
using namespace std;
class Student
{
public:
int num;
char *address;
string name;
};
int main()
{
// vector::clear()示例
std::vector<Student*> m_studentVec;
cout << "Stage1:" << m_studentVec.size() << endl;
Student s1;
s1.num = 1;
Student s2;
s2.num = 2;
Student s3;
s3.num = 3;
m_studentVec.push_back(&s1);
m_studentVec.push_back(&s2);
m_studentVec.push_back(&s3);
cout << "Stage2:" << m_studentVec.size() << endl;
// s1、s2、s3是对象,不是new出来的,不需要delete,否则会报错
m_studentVec.clear();
cout << "Stage3:" << m_studentVec.size() << endl;
Student *s4 = new Student();
s4->num = 4;
Student *s5 = new Student();
s5->num = 5;
Student *s6 = new Student();
s6->num = 6;
m_studentVec.push_back(s4);
m_studentVec.push_back(s5);
m_studentVec.push_back(s6);
cout << "Stage4:" << m_studentVec.size() << endl;
// s4、s5、s6是new出来的,需要delete,如果不delete,只使用clear(),虽然也可以清空,但不会将原vector中的元素的指针置空
std::vector<Student*>::iterator iter = m_studentVec.begin();
for (; iter!=m_studentVec.end();iter++)
{
if (*iter)
{
delete *iter;
*iter = NULL;
}
}
m_studentVec.clear();
cout << "Stage5:" << m_studentVec.size() << endl;
return 0;
}
运行结果如下:
以map::clear()为例:
#include<iostream>
#include <map>
using namespace std;
class Student
{
public:
int num;
char *address;
string name;
};
int main()
{
// map::clear()示例
typedef std::map<int, Student*> StudentMap;
StudentMap m_students;
int index = 0;
cout << "Stage1:" << m_students.size() << endl;
Student s1;
s1.num = 1;
Student s2;
s2.num = 2;
Student s3;
s3.num = 3;
m_students[index++] = &s1;
m_students[index++] = &s2;
m_students[index++] = &s3;
cout << "Stage2:" << m_students.size() << endl;
// s1、s2、s3是对象,不是new出来的,不需要delete,否则会报错
m_students.clear();
cout << "Stage3:" << m_students.size() << endl;
Student *s4 = new Student();
s4->num = 4;
Student *s5 = new Student();
s5->num = 5;
Student *s6 = new Student();
s6->num = 6;
m_students[index++] = s4;
m_students[index++] = s5;
m_students[index++] = s6;
cout << "Stage4:" << m_students.size() << endl;
// s4、s5、s6是new出来的,需要delete,如果不delete,只使用clear(),虽然也可以清空,但不会将原map中的元素的指针置空
for (StudentMap::iterator iter = m_students.begin();
iter != m_students.end(); ++iter)
{
if (iter->second)
{
delete iter->second;
iter->second = NULL;
}
}
m_students.clear();
cout << "Stage5:" << m_students.size() << endl;
return 0;
}
运行结果如下: