STL中clear()操作方法的使用细节
来源:互联网 发布:oracle数据库字段类型 编辑:程序博客网 时间:2024/05/18 00:15
原型:
#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;}
运行结果如下:
阅读全文
0 0
- STL中clear()操作方法的使用细节
- [C++杂记] STL中vector中clear的使用
- STL使用中注意的细节
- vector::clear ()方法的使用细节
- STL中vector元素的一些操作方法
- stl中unordered_map的insert/clear 性能问题解决
- CSS中 clear.both 的使用
- 使用stl 注意细节
- 使用反射技术操作方法所有细节
- STL clear
- ABAP中CLEAR初始化带表头行的内表的细节
- clear logfile的使用
- STL deque的clear方法(9)
- android中使用SharedPreferences进行数据存储的操作方法
- STL不方便的细节总结
- matlab中clear的用法
- css中clear的理解
- clear:both 的使用
- Sublime Text 3 Package Control安装问题
- 400
- Centos7防火墙firewall简单介绍
- linux中mysql用到my.cnf
- Pinyin4j的基本用法
- STL中clear()操作方法的使用细节
- 行杂记之Zookeeper SessionTimeOut分析
- java访问者模式
- 【剑指offer】题47:不用加减乘除做加法
- sql笔记本
- 17Jquer定时刷新以及循环遍历功能和ajax 的异步请求数据
- JPA中的Page与Pageable
- Git错误non-fast-forward后的冲突解决
- Java list add方法和addAll方法效率