为何输入相同元素时C++ vector的大小会出现异常变化?
问题原因分析
- 核心错误:循环计数器被输入值覆盖
你在for (int i=0; i<n; ++i)循环中,直接把输入值读到循环变量i里,直接篡改了循环的计数逻辑,循环的执行次数完全由输入值决定,不再是固定的n次。
第一种场景:输入n=5,后续输入1、2、3、4、5
循环执行过程:
- 初始i=0,满足i<5,读入1赋值给i,存入vec1,循环结束自动执行++i,i变为2
- i=2满足i<5,读入2赋值给i,存入vec1,++i后i=3
- i=3满足i<5,读入3赋值给i,存入vec1,++i后i=4
- i=4满足i<5,读入4赋值给i,存入vec1,++i后i=5
此时i=5不满足i<5,循环直接终止,第5个输入5根本没有被读取,最终vec1只有4个元素,和观测到的现象一致。
第二种场景:预期循环执行4次,后续输入1、2、2、2、3、4
循环执行过程中,多次读入2赋值给i:比如某次循环i=3进入循环,读入2赋值给i,存入vec1后执行++i,i回到3,再次满足i<4进入循环,相当于循环多执行了多次,直到后续读入的数加1后大于等于n才会终止,所以最终会把输入的6个值全部存入vec1,大小为6。
- 次要错误:循环体缺省花括号导致逻辑不符合预期
你写的遍历代码没有加花括号:
for( it = vec1.begin(); it !=vec1.end(); it++) cout<<*it<<" "; cout<<vec1.size();
只有第一行cout<<*it<<" ";属于循环体,第二行打印vector大小的代码只会在遍历结束后执行一次,不会每次遍历都打印大小。
修复方案
将循环内的输入值存入独立的临时变量即可,参考修改后代码:
#include<bits/stdc++.h> using namespace std; int main(){ int n; cin>>n; vector<int> vec1; for (int i=0; i<n; ++i){ int tmp; cin>>tmp; vec1.push_back(tmp); } sort(vec1.begin(), vec1.end()); vector<int> :: iterator it; for( it = vec1.begin(); it !=vec1.end(); it++){ cout<<*it<<" "; } cout<<vec1.size(); return 0; }
内容的提问来源于stack exchange,提问作者Sanjeev Kumar Singh-19CS48
相关产品推荐
相关产品推荐

