STL中clear()操作方法的使用细节

来源:互联网 发布:oracle数据库字段类型 编辑:程序博客网 时间:2024/05/18 00:15
原型:
#include <vector>
void clear();
函数clear()删除储存在vector中的所有元素. 如果vector的元素是一些object, 则它将为当前储存的每个元素调用它们各自的析构函数(destructor). 然而, 如果vector储存的是指向对象的指针, 此函数并不会调用到对应的析构函数. 在第二种情况下, 为了完全删除vector中的元素则应使用一个类似于下的循环:
    std::vector<SomeObject*> aVector;
    //The elements of the vector are created with the operand 'new' at some point in the program
    [...]
    for(int i=0 ; i<aVector.size() ; i++)
        delete aVector[i];
    aVector.clear();
调用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):
    std::vector aVector;
    [...]
    aVector.swap( std::vector() );
这样做会创建一个临时的空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;}

运行结果如下:



原创粉丝点击