为何C++代码输出出现零?push_back与下标赋值的差异问题
问题原因分析
当你用vector<int> b(m)创建vector时,这个容器会预先分配m个默认值为0的int元素——因为int类型的默认初始化值就是0。
- 用
push_back(k)时,是在这m个0的末尾追加新元素,循环m次后,b的总长度变成了m(初始的0) + m(输入的元素)=2m,所以输出时会先显示前m个0,再显示你输入的数值。 - 用
b[j]=k时,是直接覆盖vector中已存在的第j个元素(也就是初始的0),循环结束后b的长度还是m,所有元素都是你输入的值,自然不会有0。
解决方法
方法1:直接覆盖初始元素(推荐,贴合你原本的写法)
保持vector<int> b(m)的创建方式,用下标赋值替换push_back:
vector<int> b(m); cout<<"Element:"<<endl; for(int j=0;j<m;j++) { int k; cin>>k; b[j] = k; // 覆盖初始的0 }
方法2:创建空vector后追加元素
如果不想预先创建默认元素,可以初始化空vector,再逐个添加元素:
vector<int> b; b.reserve(m); // 可选:预分配m个元素的空间,避免多次扩容提升性能 cout<<"Element:"<<endl; for(int j=0;j<m;j++) { int k; cin>>k; b.push_back(k); // 从空开始追加,最终长度为m }
额外小提示
你的代码中vector<vector<int>>a(2);初始化了包含2个空vector的容器,之后又循环2次push_back(b),最终a会有4个元素(前两个是空vector,输出时会显示两行空内容)。如果不需要这两个初始空vector,改成vector<vector<int>> a;即可。
内容的提问来源于stack exchange,提问作者Coder124
相关产品推荐
相关产品推荐

