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

B2China 2004-09-03 05:33:07
#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=

为什么存进去的元素取出来却是空的呢???
...全文
206 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
liyu_ah 2004-09-05
  • 打赏
  • 举报
回复
#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的尺寸,把分配了而没有使用的部分去掉


wsheng98 2004-09-04
  • 打赏
  • 举报
回复
可以用MyMap.reserve(1); 来代替MyMap.resize(1);
ntxs 2004-09-04
  • 打赏
  • 举报
回复
在压入(push_back)元素进去的时候不先用resize分配空间可以吗?

可以 它本身默认了一个空间 当你压入的数超过了它默认的哪个空间后 它会自己将空间增大到原来的两倍 所以不用为这担心

那么resize有什么用呢?

resize是让你重新为vector分配空间并初始化为“与底层元素想关联的初始值”。
这里你用到的是类 所以调用了不带任何参数的构造函数

MyMap.resize(1); 表示你为vector分配了一个空间并已经初始化了
当你 MyMap.push_back(myclass) ;的时候,已经动态为你分配了多的空间,你的myclass实际上是在1的位置上,而不是0位置。
Vigorcsdn 2004-09-04
  • 打赏
  • 举报
回复
问题的关键就在,MyMap.resize(n); 表示你为vector分配了n个空间并*已经初始化了*
所以你push_back()后,你的元素是在n个位置的下一个
ying622 2004-09-04
  • 打赏
  • 举报
回复
那MyMap.resize(1)应该在什么样的场合下使用呢?能说说吗
beyondtkl 2004-09-03
  • 打赏
  • 举报
回复
在压入(push_back)元素进去的时候不先用resize分配空间可以吗?

晕。。。我刚说了 vector相当于动态数组 他的长度由系统来自动分配
他是这么一个算法的

1. 给一个初始的维数<长度> 可能为4 ( 4*sizeof(..))
2. 当你插入5个对象时 系统会进行
2.1 分配个多的空间 可能为 4*2 或者 4*4
2.2 将这些数据<你的对象> copy到新的空间中 (我要声明一下,我记得是这样的,不过还需要回去查查 ^_^)

所以 你不用 担心他的长度问题

resize 可以指定前面几个 保留给你用
比如 你resize(1) 那么你再插入的时候 就是插入第二个位置了
当然 你需要的话 可以直接 vec[0] 赋值...
B2China 2004-09-03
  • 打赏
  • 举报
回复
在压入(push_back)元素进去的时候不先用resize分配空间可以吗?

那么resize有什么用呢?
Mephisto_76 2004-09-03
  • 打赏
  • 举报
回复
因为使用了resize()后,你的MyMap实际上就是有个元素了,再用push_back()就将元素插入到第二个位置,也就是MyMap[1]中。你可以将resize()这一句去掉,或者直接给MyMap[0]赋值。
beyondtkl 2004-09-03
  • 打赏
  • 举报
回复
vector 相当于 动态数组 其长度可以动态增长

如果想知道详情 可以看 stl 源码分析

beyondtkl 2004-09-03
  • 打赏
  • 举报
回复
//MyMap.resize(1); 屏蔽之

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧