为什么我的vector变量存元素进去以后再取出来以后发现内容是空的?
#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




