CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

为什么我的vector变量存元素进去以后再取出来以后发现内容是空的?

楼主B2China(海陆空天电磁)2004-09-03 17:33:07 在 C/C++ / C++ 语言 提问

#include   <stdio.h>  
  #include   <string>  
  #include   <vector>  
  using   namespace   std;  
   
  class   CMyClass  
  {  
    public   :  
                    int   x;  
                    string   s;  
  };  
   
  void   main()  
  {  
      vector<CMyClass>               MyMap;    
      CMyClass   myclass;  
      myclass.x   =   3;  
      myclass.s   =   "This   is   a   test";  
       
      MyMap.clear();  
      MyMap.resize(1);  
      MyMap.push_back(myclass)       ;  
      printf("\nMyMap[0].x   =%d   MyMap[0].s=%s",MyMap[0].x,MyMap[0].s.c_str());  
  }  
   
  运行结果:  
  MyMap[0].x   =-1073743344   MyMap[0].s=  
   
  为什么存进去的元素取出来却是空的呢??? 问题点数:20、回复次数:10Top

1 楼beyondtkl(大龙驹<*好久没来了,兄弟们好吧。*>)回复于 2004-09-03 17:39:59 得分 3

//MyMap.resize(1);   屏蔽之Top

2 楼beyondtkl(大龙驹<*好久没来了,兄弟们好吧。*>)回复于 2004-09-03 17:41:45 得分 0

vector   相当于   动态数组   其长度可以动态增长    
   
  如果想知道详情   可以看   stl   源码分析  
   
  Top

3 楼Mephisto_76((望美人如梦))回复于 2004-09-03 17:47:40 得分 3

因为使用了resize()后,你的MyMap实际上就是有个元素了,再用push_back()就将元素插入到第二个位置,也就是MyMap[1]中。你可以将resize()这一句去掉,或者直接给MyMap[0]赋值。Top

4 楼B2China(海陆空天电磁)回复于 2004-09-03 17:53:25 得分 0

在压入(push_back)元素进去的时候不先用resize分配空间可以吗?  
   
  那么resize有什么用呢?Top

5 楼beyondtkl(大龙驹<*好久没来了,兄弟们好吧。*>)回复于 2004-09-03 18:06:24 得分 0

在压入(push_back)元素进去的时候不先用resize分配空间可以吗?  
   
  晕。。。我刚说了   vector相当于动态数组   他的长度由系统来自动分配    
  他是这么一个算法的  
   
  1.   给一个初始的维数<长度>   可能为4   (   4*sizeof(..))  
  2.   当你插入5个对象时   系统会进行  
  2.1   分配个多的空间   可能为   4*2   或者   4*4  
  2.2   将这些数据<你的对象>   copy到新的空间中   (我要声明一下,我记得是这样的,不过还需要回去查查   ^_^)  
   
  所以   你不用   担心他的长度问题    
   
  resize   可以指定前面几个   保留给你用  
  比如   你resize(1)   那么你再插入的时候   就是插入第二个位置了  
  当然   你需要的话   可以直接   vec[0]   赋值...Top

6 楼ntxs(别人加薪我加班,数钱数到心发酸T_T)回复于 2004-09-04 04:10:19 得分 4

在压入(push_back)元素进去的时候不先用resize分配空间可以吗?  
   
  可以   它本身默认了一个空间     当你压入的数超过了它默认的哪个空间后     它会自己将空间增大到原来的两倍   所以不用为这担心    
   
  那么resize有什么用呢?  
   
  resize是让你重新为vector分配空间并初始化为“与底层元素想关联的初始值”。  
  这里你用到的是类   所以调用了不带任何参数的构造函数  
   
  MyMap.resize(1);   表示你为vector分配了一个空间并已经初始化了  
  当你   MyMap.push_back(myclass)       ;的时候,已经动态为你分配了多的空间,你的myclass实际上是在1的位置上,而不是0位置。  
  Top

7 楼wsheng98(圣)回复于 2004-09-04 11:12:42 得分 2

可以用MyMap.reserve(1);   来代替MyMap.resize(1);Top

8 楼ying622(五弦琴)回复于 2004-09-04 15:46:24 得分 2

那MyMap.resize(1)应该在什么样的场合下使用呢?能说说吗Top

9 楼Vigorcsdn(混分来滴~)回复于 2004-09-04 16:09:41 得分 2

问题的关键就在,MyMap.resize(n);   表示你为vector分配了n个空间并*已经初始化了*  
  所以你push_back()后,你的元素是在n个位置的下一个  
  Top

10 楼liyu_ah()回复于 2004-09-05 13:33:28 得分 4

#include   <stdio.h>  
  #include   <string>  
  #include   <vector>  
  using   namespace   std;  
   
  class   CMyClass  
  {  
    public   :  
                    int   x;  
                    string   s;  
  };  
   
  void   main()  
  {  
      vector<CMyClass>               MyMap;    
      CMyClass   myclass;  
      myclass.x   =   3;  
      myclass.s   =   "This   is   a   test";  
       
      MyMap.clear();  
      MyMap.resize(1);  
      MyMap.push_back(myclass)       ;  
      printf("\nMyMap[1].x   =%d   MyMap[1].s=%s",MyMap[1].x,MyMap[1].s.c_str());  
  }  
   
      MyMap.push_back(myclass)     是一个安插函数,每调用一次安插函数时,MyMap增加一个  
  所以你使用了安插函数后,他位置在1号下标而不是0号下标,所以出错。  
      MyMap.resize(1);仅仅调整VECTOR的尺寸,把分配了而没有使用的部分去掉  
   
   
  Top

相关问题

  • 怎么使用变量作为表单元素的名称
  • 如何将页面元素与页面变量动态关联?
  • 变量
  • 送分了,VB中怎么把mdb中某个特定元素赋值给一个变量?
  • 请问用Vector定义的变量/对象有什么用?
  • 如何将txt文件读入vector<string>变量中?
  • 请问在js代码里,能操作<%%>里的Vector 变量吗?
  • Vector里元素对调问题!
  • vector删除元素的问题
  • 弱问题:如何用C实现delphi中的in 功能,即判断一个变量的值是否属于集合中的一个元素值

关键词

  • 函数
  • vector
  • mymap
  • resize
  • 元素
  • myclass
  • 空间
  • 分配
  • 安插函数
  • cmyclass

得分解答快速导航

  • 帖主:B2China
  • beyondtkl
  • Mephisto_76
  • ntxs
  • wsheng98
  • ying622
  • Vigorcsdn
  • liyu_ah

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo