输入字符串数组
此类输入一般会先在第一行输入长度n
,再在第二行输入长度为n
的数组。
数组可能会用空格隔开,如
3
aaa bbb ccc
int n;
cin >> n; // 读取数组长度nstring s;
cin.ignore(); // 忽略前一个输入的换行符
getline(cin, s); // 读取整行输入vector<string> lst;
stringstream ss(s); // 使用字符串流进行处理
string token;while (getline(ss, token, ' ')) { // 使用空格分割字符串lst.push_back(token);
}
输入数字型数组
此类输入一般会先在第一行输入长度n
,再在第二行输入长度为n
的数组。
数组可能会用空格隔开,如
3
0 1 2
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {cin >> a[i];
}
或者(可以用于处理数组长度n
未知的输入)
vector<int> nums;
while (cin >> num) {nums.push_back(num);
}
输入二维数组
此类输入一般会先在第一行输入二维数组的行数n
和列数吗m
,再在接下来的n
行输入长度为m
的字符串或者数组。
字符串类型输入
5 4
aaaa
bbbb
bbcc
ddee
ffgg
int n, m;
cin >> n >> m;
vector<string> maze(n);
for (int i = 0; i < n; i++) {cin >> maze[i];
}
数字类型输入
5 4
0 0 0 0
0 0 0 1
1 1 1 2
2 2 2 3
3 3 4 4
int n, m;
cin >> n >> m;
vector<vector<int>> maze(n, vector<int>(m, 0));
for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cin >> maze[i][j];}
}
输入树或图结构
这种输入一般会告诉你树/图结构的节点数和边数,然后输入节点编号之间的连接关系。一般而言,题目会告知输入每一条边时,哪个节点是父/子节点。如
# 有向图一共有3个节点、2条边
# 假设每条边输入时
# 第一个元素是父节点,第二个元素是子节点3
2
1 2
1 3# 表示一棵形如
# 1
# / \
# 2 3
# 的树形结构
一般采用构建邻接表的形式来表示一个图,而邻接表可以用哈希表很方便地表示。
int n, m;
//节点数n和边数m
cin >> n >> m;
vector<vector<int> > g(n + 1);//邻接表
for (int i = 1; i <= m; i++) {int u, v;cin >> u >> v;//有向图g[u].push_back(v);
}
输入次数若干,以某个标识符作为停止输入的标志
这种输入一般存在多组输入的情况,以某一标识符作为停止输入的标志。如输入若干行,以END
作为终止输入的标志
string str;
while(cin >> str) { if (str == "END") {break;}//do something
}
输入次数未知(较少使用)
输入若干行,但不知道输入次数。如
0
1
2
3
int n;
//c++ while cin读取到文件尾
while(cin >> n) {//do something
}