在 C++ 中具有未知大小输入的向量的向量
Vector of vector with unknown size input in c++
我需要输入向量的向量元素。向量的大小未知。
以*字符结尾的行输入,以及向量输入。
例子
2 5 1 3 4 *
9 8 9 *
3 3 2 3 *
4 5 2 1 1 3 2 *
*
代码:
#include <iostream>
#include <vector>
int main() {
std::vector < std::vector < int >> a;
int x;
int i = 0, j = 0;
for (;;) {
while (std::cin >> x) {
a[i][j] = x;
j++;
}
if (!std::cin >> x) break;
i++;
}
return 0;
}
这允许我只输入第一行,然后程序停止。你能帮我修改这个以允许输入其他行吗?
您的代码有两个问题:
您在没有先向每个 vector
添加任何值的情况下对每个 vector
进行索引,这是 未定义的行为 。 a[i][j] = x;
不会使矢量变大。请改用 vector::push_back()
。
您没有正确处理 *
的输入。 x
是一个 int
,因此当 std::cin >> x
无法读取 non-integer 值时,如 *
,cin
将进入错误状态并且在您 clear()
错误和 ignore()
来自输入缓冲区的失败数据之前,所有进一步的阅读都会失败。
由于您的输入是 line-based,请考虑使用 std::getline()
一次读取每一行。您可以使用 std::istringstream
从每一行读取整数,例如:
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <iomanip>
int main() {
std::vector<std::vector<int>> a;
std::string line;
while (std::getline(std::cin, line)) {
std::istringstream iss(line);
iss >> std::ws;
if (iss.peek() == '*') break;
std::vector<int> v;
int x;
while (iss >> x) {
v.push_back(x);
}
a.push_back(v);
}
for(auto &v : a) {
for(int num : v) {
std::cout << num << ' ';
}
std::cout << std::endl;
}
return 0;
}
我需要输入向量的向量元素。向量的大小未知。
以*字符结尾的行输入,以及向量输入。
例子
2 5 1 3 4 *
9 8 9 *
3 3 2 3 *
4 5 2 1 1 3 2 *
*
代码:
#include <iostream>
#include <vector>
int main() {
std::vector < std::vector < int >> a;
int x;
int i = 0, j = 0;
for (;;) {
while (std::cin >> x) {
a[i][j] = x;
j++;
}
if (!std::cin >> x) break;
i++;
}
return 0;
}
这允许我只输入第一行,然后程序停止。你能帮我修改这个以允许输入其他行吗?
您的代码有两个问题:
您在没有先向每个
vector
添加任何值的情况下对每个vector
进行索引,这是 未定义的行为 。a[i][j] = x;
不会使矢量变大。请改用vector::push_back()
。您没有正确处理
*
的输入。x
是一个int
,因此当std::cin >> x
无法读取 non-integer 值时,如*
,cin
将进入错误状态并且在您clear()
错误和ignore()
来自输入缓冲区的失败数据之前,所有进一步的阅读都会失败。
由于您的输入是 line-based,请考虑使用 std::getline()
一次读取每一行。您可以使用 std::istringstream
从每一行读取整数,例如:
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <iomanip>
int main() {
std::vector<std::vector<int>> a;
std::string line;
while (std::getline(std::cin, line)) {
std::istringstream iss(line);
iss >> std::ws;
if (iss.peek() == '*') break;
std::vector<int> v;
int x;
while (iss >> x) {
v.push_back(x);
}
a.push_back(v);
}
for(auto &v : a) {
for(int num : v) {
std::cout << num << ' ';
}
std::cout << std::endl;
}
return 0;
}