代码1

  1. #include <vector>
  2. #include <stdio.h>
  3. class A
  4. {
  5. public:
  6. A()
  7. {
  8. printf("A()/n");
  9. }
  10. ~A()
  11. {
  12. printf("~A()/n");
  13. }
  14. A(const A& other)
  15. {
  16. printf("other/n");
  17. }
  18. };
  19. int main()
  20. {
  21. A a;
  22. A b(a);
  23. A c = a;
  24. return 0;
  25. }

执行结果1

  1. A()
  2. other
  3. other
  4. ~A()
  5. ~A()
  6. ~A()

代码2

  1. #include <vector>
  2. #include <stdio.h>
  3. class A
  4. {
  5. public:
  6. A()
  7. {
  8. printf("A()/n");
  9. }
  10. ~A()
  11. {
  12. printf("~A()/n");
  13. }
  14. A(const A& other)
  15. {
  16. printf("other/n");
  17. }
  18. };
  19. int main()
  20. {
  21. A a;
  22. A b(a);
  23. A c = a;
  24. printf("----------/n");
  25. std::vector<A> vec;
  26. //vec.reserve(3);
  27. vec.push_back(a);
  28. vec.push_back(b);
  29. vec.push_back(c);
  30. return 0;
  31. }

结果2

  1. A()
  2. other
  3. other
  4. ----------
  5. other
  6. other
  7. ~A()
  8. other
  9. other
  10. other
  11. ~A()
  12. ~A()
  13. other
  14. other
  15. other
  16. other
  17. ~A()
  18. ~A()
  19. ~A()
  20. ~A()
  21. ~A()
  22. ~A()
  23. ~A()
  24. ~A()
  25. ~A()

把代码2注释掉的vec.reserve(3)打开, 结果3

  1. A()
  2. other
  3. other
  4. ----------
  5. other
  6. other
  7. other
  8. ~A()
  9. ~A()
  10. ~A()
  11. ~A()
  12. ~A()
  13. ~A()

说明在使用vector时, 插入的是要插入的对象的拷贝, 如果vector中的类对象比较大时, 会影响性能, 还有使用拷贝构造时的一些深浅拷贝的问题, 另外通过结果2与结果3的比较我们可以知道当vector开始申请的空间不够使用时, 它会再次申请空间并可能放弃原来申请的空间, 这样调用的拷贝构造次数就更多了, 所以我们在使用vector前应该通过它的成员函数reserve事先申请一个我们估计的值, 你可以放心, 当reserve的空间不够大时, vector仍然会自动申请空间

下面是使用vector中存放类指针的做法, 一定要注意插入vector中对象指针指向内容的生存周期问题, 另外如果是new出来的, 如果其他地方没有delete应该在适当的时候通过遍历vector查找出来进行delete

  1. #include <vector>
  2. #include <stdio.h>
  3. class A
  4. {
  5. public:
  6. A()
  7. {
  8. printf("A()/n");
  9. }
  10. ~A()
  11. {
  12. printf("~A()/n");
  13. }
  14. A(const A& other)
  15. {
  16. printf("other/n");
  17. }
  18. };
  19. int main()
  20. {
  21. A *a = new A;
  22. A *b = new A(*a);
  23. A *c = new A(*a);
  24. printf("----------/n");
  25. std::vector<A*> vec;
  26. vec.reserve(3);
  27. vec.push_back(a);
  28. vec.push_back(b);
  29. vec.push_back(c);
  30. std::vector<A*>::iterator iter = vec.begin();
  31. for (; iter!=vec.end(); ++iter)
  32. {
  33. delete *iter;   //*iter = a , b, c
  34. }
  35. vec.clear();
  36. return 0;
  37. }

结果

  1. A()
  2. other
  3. other
  4. ----------
  5. ~A()
  6. ~A()
  7. ~A()

CPP-STL:用vector保存对象时保存指针的优点, 以及reserve的使用(转)的更多相关文章

  1. 转载:用vector保存对象时保存指针的优点, 以及reserve的使用

    #include <vector> #include <stdio.h> class A { public: A() { printf("A()/n"); ...

  2. 保存对象时碰到的问题-列名 'Discriminator' 无效

    今天保存对象时碰到问题: {"列名 'Discriminator' 无效.\r\n列名 'Discriminator' 无效."}  百度了一下,百度找到的一个解决: http:/ ...

  3. 关于SessionFactory的不同实现类分别通过getCurrentSession()方法 和 openSession() 方法获取的Session对象在保存对象时的一些区别

    一.单向多对一关联关系 一).使用LocalSessionFactoryBean类,即在applicationContext中配置的 <!-- 配置SessionFactory 使用LocalS ...

  4. JSON(未完待续,等讲到对象时再加)

    1 定义 JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 JSON 独立于语言:JSON 使用 Jav ...

  5. STL中的函数对象实现负数的定义

    // // main.cpp // STL中的函数对象 // // Created by mac on 2019/5/2. // Copyright © 2019年 mac. All rights r ...

  6. STL中list中push_back(对象)保存对象的内部实现

    STL中list中push_back(对象)保存对象的内部实现 1. 在容器中,存放的是对象拷贝 #include<iostream> #include<list> using ...

  7. 程序启动读取和关闭时保存应用程序设置(QSettings)

    保存应用程序设置(QSettings)1. QSettings 类 QSettings 提供保存应用程序当前设置的接口,可以方便地保存程序的状态,例如窗口大小和位置,选项的选中状态等等.在 Windo ...

  8. tomcat cluster session同步时保存map数据遇到的问题

    Tomcat Cluster官网:https://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html(tomcat7.0) 场景: tomcat1 ...

  9. 使用JPA保存对象时报nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly错误

    使用JPA保存对象时报nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOn ...

随机推荐

  1. IP分片 与 TCP分段的区别 !!!!careful========以及udp中一个包大小究竟为多大合适 ==========三次握手四次挥手细节

    首先声明:TCP分片应该称为TCP分段 TCP/IP详解--TCP的分段和IP的分片 分组可以发生在运输层和网络层,运输层中的TCP会分段,网络层中的IP会分片.IP层的分片更多的是为运输层的UDP服 ...

  2. python文件操作和集合(三)

    对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句柄操作文件 3.关闭文件. 文件基本操作:         f = open('file.txt','r') #以 ...

  3. Spring boot-(3) Spring Boot特性2

    1. 外部配置 Spring Boot支持外部配置,以便可以在不同的环境中使用相同的应用程序代码.可以使用properties文件,YAML文件,环境变量或命令行参数进行外部配置.可以使用@Value ...

  4. SWIG 和 Python——c/c++与脚本交互

    C 和 C++ 被公认为(理当如此)创建高性能代码的首选平台.对开发人员的一个常见要求是向脚本语言接口公开 C/C++ 代码,这正是 Simplified Wrapper and Interface ...

  5. mathjax符号

    mathjax公式 \(\delta\): \delta \(\Delta\): \Delta \(\int\): \int \(\iint\): \iint \(\approx\): \approx ...

  6. IOS如何打越狱包xcode无证书打包ios应用

    本文要介绍的是在无证书的情况下如何将自己应用打包出去在越狱设备上使用或发给第三方使用企业签名进行应用分发. 前提条件:拥有appleId账号,并且该账号已经注册开发者中心(无需花钱) 教程开始: 1. ...

  7. linux创建用户与删除用户及问题解决(ubuntu)

    创建的用户不正确,一直在删除创建,发现了挺多问题也学到了一些东西如下是我的总结. (root用户设置: 由于ubtun系统默认是没有激活root用户的,需要我们手工进行操作,在命令行界面下,或者在终端 ...

  8. 在DataColumn.Expression把DateTime转换成String的问题

    我在使用MySql5.1的数据库中,使用winForm的DataGridView要把数据库中全称DateTime格式,转换成Date格式,就是把日期时间转换成日期,不要时间.如‘2013-07-08 ...

  9. FastDFS 搭建

    #FastDFS安装方式 安装必要插件:libevent  (此次搭建方案采用libevent 1.4.13)   wget http://fastdfs.googlecode.com/files/F ...

  10. IDEA插件JRebel安装配置与破解激活详细教程(转)

    JRebel 介绍 IDEA上原生是不支持热部署的,一般更新了 Java 文件后要手动重启 Tomcat 服务器,才能生效,浪费不少生命啊.目前对于idea热部署最好的解决方案就是安装JRebel插件 ...