试想一个案例,假设需要你输入n行数字,而每一行输入的数字数量都未知(不定),如何通过C++来实现这一操作?
本贴笔者给出一个具体案例:首先规定输入的行数,而后在每一行输入不定量的数字,最后将每一个数字对应的值,以及与其匹配的行数输出。
例如,输入:
2
1 2 3 4 5
6 7
则输出:
1,1
1,2
1,3
1,4
1,5
2,6
2,7
具体的思想是:定义一个二值对类型,再用一个该类型的vector实现无限存储数据的功能。
定义结构体
struct goal{
int num;
int name;
};
定义初始变量
vector<goal> T;
//目标数组
int num=0;
cin>>num;
while循环通过回车结束输入!
ignore函数可以清楚cin输入字符后的'\n',在这里使用主要用来实现合法换行的过渡。具体解释见代码注释~
cin.ignore();
//由于输入的行数是第一个输入
//在终端会多执行一次回测
//所以要用额外的ignore函数处理一次!
for(int i=1;i<=num;i++)
{
cout<<"这是第"<<i<<"行的输入:"<<endl;
char c;
cin.get(c);
//获取第一个输入
while(c!='\n'){
cin.ignore();
//通过ignore函数清空上一次的回车符缓存!
//否则会直接跳出循环
goal temp;
temp.name=c-48;
temp.num=i;
T.push_back(temp);
cin.get(c);
//获取下一次的输入
}
}
迭代器检验输入结果
for(vector<goal>::iterator it=T.begin();it!=T.end();it++)
cout<<(*it).num<<" "<<(*it).name<<endl;
全代码如下:
#include <iostream>
#include <vector>
using namespace std;
struct goal{
int num;
int name;
};
int main(int argc, char** argv) {
vector<goal> T;
//目标数组
int num=0;
cin>>num;
cin.ignore();
//由于输入的行数是第一个输入
//在终端会多执行一次回测
//所以要用额外的ignore函数处理一次!
for(int i=1;i<=num;i++)
{
cout<<"这是第"<<i<<"行的输入:"<<endl;
char c;
cin.get(c);
//获取第一个输入
while(c!='\n'){
cin.ignore();
//通过ignore函数清空上一次的回车符缓存!
//否则会直接跳出循环
goal temp;
temp.name=c-48;
temp.num=i;
T.push_back(temp);
cin.get(c);
//获取下一次的输入
}
}
for(vector<goal>::iterator it=T.begin();it!=T.end();it++)
cout<<(*it).num<<" "<<(*it).name<<endl;
return 0;
}
输入测试用例:13197371 7166
结果与预期一致!