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

代码1

[cpp] view plaincopy

  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

[cpp] view plaincopy

  1. A()

  2. other

  3. other

  4. ~A()

  5. ~A()

  6. ~A()

代码2

[cpp] view plaincopy

  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

[cpp] view plaincopy

  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

[cpp] view plaincopy

  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

[cpp] view plaincopy

  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. }

结果

[cpp] view plaincopy

  1. A()

  2. other

  3. other

  4. ----------

  5. ~A()

  6. ~A()

  7. ~A()

CPP-STL:用vector保存对象时保存指针的优点, 以及reserve的使用(转),布布扣,bubuko.com

时间: 2024-10-08 11:13:09

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

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

#include <vector> #include <stdio.h> class A { public: A() { printf("A()/n"); } ~A() { printf("~A()/n"); } A(const A& other) { printf("other/n"); } }; int main() { A a; A b(a); A c = a; return 0; } 执行结果1 A() o

C++手稿:STL中的函数对象与函数指针

先来感受一下C++中的函数对象和函数指针: template<typename T> void printer(int a, int b, T func){ cout<<func(a, b)<<endl; } 在STL中定义了很多像上面这样的模板,这里的T是一个可调用(实现了括号运算符)的东西. 这使得我们在使用模板时可以指定一个计算策略,它可以是函数对象,也可以是函数指针. Less<int>便是一个常见的函数对象,常用来配置容器或算法.<funct

保存对象

在接触redits的时候,看到项目许多对象继承了Serializable,序列化对象.其实际作用就是将对象保存起来.参考http://developer.51cto.com/art/201202/317181.htm我觉得写得通俗易懂. 1. 什么是Java对象序列化 Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长.但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定

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

STL中list中push_back(对象)保存对象的内部实现 1. 在容器中,存放的是对象拷贝 #include<iostream> #include<list> using namespace std; class A{ int i; static int num; public: A():i(0){ cout<<"A()" <<endl; num ++;} A(int ii):i(ii){ cout<<"A(i

tomcat cluster session同步时保存数据的问题

Tomcat Cluster官网:https://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html(tomcat7.0) 场景: tomcat1 tomcat2    |            |--------|---------      nginx tomcat版本:7.0.59 1.后端应用为2台tomcat容器,并且配置了Tomcat Cluster:2.nginx为前端web服务器,负责反向代理和负载均衡(简单轮训),配置如下:

atitit.spring hibernate的事务机制 spring不能保存对象的解决

atitit.spring hibernate的事务机制 spring不能保存对象的解决 sessionFactory.openSession() 不能. . log黑头马sql语言.. sessionFactory.getCurrentSession().update(user); 中间走ok兰..log黑头也有累.. 在Spring中使用Hibernate.假设我们配置了TransactionManager.那么我们就不应该调用SessionFactory的openSession()来获得S

将json对象数据保存到数据库对应的表中

问题描述  如何将json对象数据保存到数据库对应的表中. 分析问题   json数据内容不固定,json数据格式是固定的(name:value),数据库表结构是固定的,在json数据格式 与 数据库表结构之间建立一套对应规则,写一套逻辑解析这套对应规则. 1.json对象对应的数据库表需要确定. 2.json对象的节点对应数据库表的列需要确定. 3.json对象的value类型需要确定下来,才能对value值做相应的操作. 4.数据库表的主键列比较特殊,一般是自增长列,需要确定. 5.数据库记

python学习笔记-对象持久化保存与恢复

序列化的概念很简单.内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给其他人.你会怎么做?嗯, 这取决于你想要怎么保存,怎么重用,发送给谁.很多游戏允许你在退出的时候保存进度,然后你再次启动的时候回到上次退出的地方.(实际上, 很多非游戏程序也会这么干.) 在这个情况下, 一个捕获了当前进度的数据结构需要在你退出的时候保存到磁盘上,接着在你重新启动的时候从磁盘上加载进来.这个数据只会被创建它的程序使用,不会发送到网络上,也不会被其它程序读取.因此,互操作的问题被限制在保证新版本的程序能

关于hibernate用save方法保存对象所遇到的一个问题

执行数据库循环保存操作时,开始想只new一个对象,这样会节省一些空间,所以在for循环外面执行new操作,在for循环里面则执行设值操作,然后每次都提交事务到数据库.如下图: 结果发现数据库里只插入了一条数据,查看sql语句才发现问题的所在,sql语句如下: hibernate只执行了一次insert操作,剩下的都是更新操作,所以最后表里面只有一条数据. 然后我就进行了修改,在每一次for循环里都new一个对象,如下图: 执行插入操作后查看sql语句,发现这次就插入成功了,执行了5次的inser