vector 使用resize然后通过下标赋值出错

C++语言 码拜 7年前 (2015-05-11) 1065次浏览 0个评论

不想通过push_back来增加元素,想尝试下标的方式,根据网友所说下标访问的前提是该内存中存在元素,我想resize不是重新分配内存了么,应该可以实现。但是实际出错了,以下是我的代码
void main(int argc, char* argv[])
{
vector<vector<int> > edges;
edges.resize(3);
for(int i=0;i<3;i++)
{
edges[i].resize(3);
}
for (i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{ if(i==j)
edges[i][j]=0;
else
edges[i][j]=1;
}
}
for (i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
cout<<edges[i][j]<<“\t”;
}
cout<<endl;
}
cout<<endl;

//调试时以上没有问题,问题出在下面
edges.resize(4);   
edges[3].resize(4);
n=edges.size();                                               //size确实变了
nn=edges[3].size();
for(i=0;i<edges.size();i++)
{
edges[i][3]=edges[3][i]=4;
}
int j;
for (i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
cout<<edges[i][j]<<“\t”;
}
cout<<endl;
}   

以上代码可以实现输出所有元素,但是输出完了之后会报错:DAMAGE:after normal block(#81)at 0x00393C88
网上类似的报错是因为指针问题,但是我不知道我这个问题在哪。求大神帮助,网上都是一下resize(),reverse()的讲解,没有看到这个问题。

20分
edges.resize(4);   
edges[3].resize(4);
n=edges.size();                                               //size确实变了
nn=edges[3].size();
for(i=0;i<edges.size();i++)
{
edges[i][3]=edges[3][i]=4;  // 不是edges[0] edges[1] … 都有4个元素,上面的一段代码就用了一个for循环对每个元素做resize操作,那样其实是正确的,但是这里没有这么做
}

resize会修改vector的大小,里面的元素都是有效的,使用size接口访问,返回的值会变
但是reserve只是让vector保留多少个元素,保留并不会改变vector元素的大小
vector<int>为例,假如它有一个int *p的一个指针用来保存push_back或者插入的数字,一个成员变量mem_size保存指针p指向的内存int的个数,再来一个成员变量size表示实际使用的大小,那resize跟reserve什么区别,想必楼主就能明白了

我想问的不是resize和reverse的区别啦。不过还是谢谢你,我知道自己错哪了,是因为我的edges[3].resize(4)只是将第三行扩充为4列,应该改成
for(int i=0;i<4;i++)
        edges[i].resize(4);
对吗,非常感谢

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明vector 使用resize然后通过下标赋值出错
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!