vector的几个问题

乐哉悠哉 2010-12-13 12:52:27

#include <iostream>
#include <vector>

using namespace std;

void main()
{
vector<vector <int> > myarray(3, vector <int> (10) ); //建立二维数组,自动初始化为0

for(int i=0; i<3; i++)
for(int j=0; j<10; j++)
myarray[i][j]=i*j+j; //自定义初始化

myarray.resize(4); //这里一个问题,resize之后新增加的那个向量的初值是随机的,不会被默认为零

for(i=0; i<10; i++)
myarray[3][i]=3;//这里,编译没错,运行出现内存错误,若改为myarray[3].push_back(3);则没有问题

myarray[3].clear();//clear所谓的清空难道不是把第四个向量的元素值修改为零吗?运行好像一点效果也没有
//并且为什么不能用myarray.clear()清空整个数组,如果这样会出现运行内存错误

for( i=0; i<4; i++)
{
cout<<endl;
for(int j=0; j<10; j++)
cout<<myarray[i][j]<<" ";
}
}
...全文
263 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
iioossaa 2010-12-15
  • 打赏
  • 举报
回复
17楼分析得透彻
zzxlsrl 2010-12-15
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 zanglengyu 的回复:]
myarray[3][i]=3;//这里,编译没错,运行出现内存错误,若改为myarray[3].push_back(3);则没有问题

这里绝对不行,vector的下标操作不允许这样,必须是已经存在的元素才能进行下标操作符进行索引。通过下标操作进行赋值时,不会添加任何元素。

myarray[3].clear();//clear所谓的清空难道不是把第四个向量的元素值修改为零吗?运行好像……
[/Quote]
不错,不错!
witlym311 2010-12-14
  • 打赏
  • 举报
回复
myarray[3][i]=3;//这里,编译没错,运行出现内存错误,若改为myarray[3].push_back(3);则没有问题
vector 不是用 = 来赋值的,它的维数都没有定,怎么用 = 来给他赋值呢?只能有myarray[3].push_back(3)赋值, = 可以修改值。
zsjay758 2010-12-14
  • 打赏
  • 举报
回复
resize后的第四个元素的大小为0,针对于myarray[3][j]进行赋值是非法的,会导致内存中的数据被破坏。
至于退出后异常是由于内存中的数据已经被覆盖掉,导致释放内存时出现错误。
resize(4)后,可以使用myarray[3].resize(10)就可以得到正确答案了
江南烟雨梦 2010-12-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 guankle 的回复:]
没有哪位前辈能讲清楚点吗?
[/Quote]
clear只是将元素从vector中移除,并不delete元素占用的内存空间,建议使用erase.
fh8436 2010-12-14
  • 打赏
  • 举报
回复
最好用at
pengzhixi 2010-12-14
  • 打赏
  • 举报
回复
resize后添加的默认的vector<int>的size大小是0,当然你的
for(int i=0; i<10; i++)
myarray[3][i]=3
肯定是不正确的,会不会崩溃看运气。

至于后面的clear();对size为0的vector使用它没什么问题
乐哉悠哉 2010-12-14
  • 打赏
  • 举报
回复
没有哪位前辈能讲清楚点吗?
zanglengyu 2010-12-14
  • 打赏
  • 举报
回复
myarray[3][i]=3;//这里,编译没错,运行出现内存错误,若改为myarray[3].push_back(3);则没有问题

这里绝对不行,vector的下标操作不允许这样,必须是已经存在的元素才能进行下标操作符进行索引。通过下标操作进行赋值时,不会添加任何元素。

myarray[3].clear();//clear所谓的清空难道不是把第四个向量的元素值修改为零吗?运行好像一点效果也没有
//并且为什么不能用myarray.clear()清空整个数组,如果这样会出现运行内存错误

这里肯定了,假如用myarray.clear()那只是清除的vector<int> 类型的元素,而
而非int型,内存里最终是int型元素占用内存,这导致vector<int>内部的int型元素没有释放内存,造成内存丢失。

而用myarray[3].clear()之后
接着您又用下标操作进行输出这本身就是矛盾,因为已经清除,myarray[3].clear()相当于myarray[3].erase(myarray[3].begin(),myarray[3].end());
如果用迭代器输出就看得出来效果了 至于你这种做法只能说明 clear清除的只是将其从容器中清除,而并未释放内存,所以如果用下表操作的话,是看不到效果的 修改后代码如下

#include <iostream>
#include <vector>

using namespace std;

int main()
{
vector<vector <int> > myarray(3, vector <int> (10) ); //建立二维数组,自动初始化为0

for(int i=0; i<3; i++)
for(int j=0; j<10; j++)
myarray[i][j]=i*j+j; //自定义初始化
myarray.resize(4); //这里一个问题,resize之后新增加的那个向量的初值是随机的,不会被默认为零
for(int i=0; i<10; i++)
myarray[3].push_back(3);//这里,编译没错,运行出现内存错误,若改为myarray[3].push_back(3);则没有问题
myarray[3].clear();//clear所谓的清空难道不是把第四个向量的元素值修改为零吗?运行好像一点效果也没有
//并且为什么不能用myarray.clear()清空整个数组,如果这样会出现运行内存错误
for(vector<vector<int> >::iterator iter1=myarray.begin();iter1!=myarray.end();++iter1)
{
cout<<endl;
for(vector<int>::iterator iter2=(*iter1).begin();iter2!=(*iter1).end();++iter2)
cout<<*iter2<<" ";
}
system("pause");
return 0;
}

zzxlsrl 2010-12-14
  • 打赏
  • 举报
回复
不错,学习了
liyaobinRyan 2010-12-14
  • 打赏
  • 举报
回复
占个位帮顶一下
失落的凡凡 2010-12-14
  • 打赏
  • 举报
回复
resize会用默认构造函数去初始化新的对象。所以myarray[3]是一个空的vector<int>。
乐哉悠哉 2010-12-13
  • 打赏
  • 举报
回复
编译器是VC6.0
乐哉悠哉 2010-12-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hnuqinhuan 的回复:]
在顺序容器中添加元素只能用myarray[3].push_back(3);
[/Quote]
那关于clear的疑问呢?能不能帮助解答下~
無_1024 2010-12-13
  • 打赏
  • 举报
回复
在顺序容器中添加元素只能用myarray[3].push_back(3);
乐哉悠哉 2010-12-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bdmh 的回复:]
resize之后新增加的那个向量的初值是随机的,不会被默认为零
因为它分配的空间,可能被其他的程序写入过,留下了垃圾数据,分配给你之后,你读取的就是残留的垃圾数据

myarray[3],这已经是访问第4个元素了,已经越界
[/Quote]
我之前不是用resize扩展了原来的数组吗?resize执行之后数组就变成了4*10的了,为什么说是越界?
乐哉悠哉 2010-12-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qq120848369 的回复:]
C/C++ code

myarray.resize(4);

for(int i=0; i<10; i++)
myarray[3][i]=3


越界了,没什么大不了.
[/Quote]

你指的是内存不够用了还是没分配够那么多?
bdmh 2010-12-13
  • 打赏
  • 举报
回复
resize之后新增加的那个向量的初值是随机的,不会被默认为零
因为它分配的空间,可能被其他的程序写入过,留下了垃圾数据,分配给你之后,你读取的就是残留的垃圾数据

myarray[3],这已经是访问第4个元素了,已经越界
qq120848369 2010-12-13
  • 打赏
  • 举报
回复

myarray.resize(4);

for(int i=0; i<10; i++)
myarray[3][i]=3


越界了,没什么大不了.

64,691

社区成员

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

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