C++ 如何处理以 contests/problems 格式给出的用户输入
C++ How to handle user input given in contests/problems format
最近我开始参加 c++ 竞赛,但我找不到处理这种格式的用户输入的最佳方法。
例如4和3是下一块输入的维度
4 3
1 2 4 5
1 6 7 4
1 5 0 0
我一直遇到的问题是,有时自动测试机可以成功测试它的输入,有时不能,目前我一直使用的方法是下一个
std::vector<std::vector<char>> vec;
void get_lines(std::string in) {
std::vector<char> line(in.begin(), in.end());
vec.push_back(line);
}
std::cin >> height >> width;//this is in main()
std::cin.ignore();
for (int i = 0; i < height; i++)
{
std::getline(std::cin, input);
get_lines(input);
input = "";
}
但我敢肯定这不是处理此类输入的最有效也不是最稳定的方法。
如何处理上述格式的用户输入,以便测试机可以轻松输入其值?
你可以这样做:
std::cin >> height >> width;
std::vector<std::vector<int>> vec;
vec.resize(height, vector<int>(width)); // resize
for(int i {0}; i < height; ++i)
{
for(int j {0}; j < width; ++j)
{
std::cin >> vec[i][j];
}
}
首先,对于您做出参加此类比赛的决定,我深表歉意。它将帮助您学习如何解决算法,但他们通常使用极其糟糕的编程风格。
总之。回到你的问题。一如既往。这取决于。如果您的数据仅由白色 space 分隔,您几乎可以使用带有提取器运算符“>>”的格式化输入函数。此运算符将忽略(跳过)标准模式下的所有白色 space,包括行尾的“新行”。因此,无需逐行阅读。
这个“竞赛页面”的好处是输入总是被认为是正确的。因此,您不需要进行输入错误检查或数据合理化。他们将始终使用一些测试环境,在那里他们通过输入重定向“推送”代码中的数据。在现实生活中,用户输入总是很容易出错,必须仔细检查。
你看,虽然不是必须的,但他们给出了矩阵的维度,以简化数据输入(这通常是没有必要的,因为我们可以自己找出)。
- 所以,首先阅读尺寸。
- 有了它,构建你的'std::vector'
- 然后使用 2 个基于嵌套范围的 for 循环来读取值
许多可能的示例之一可能如下所示:
#include <iostream>
#include <vector>
int main() {
// Define variables that will hold the dimension of the matrix
size_t numberOfRows{}, numberOfColumns{};
// Get user input, the dimension of the matrix
std::cin >> numberOfRows >> numberOfColumns;
// Define our container, including its size
std::vector<std::vector<int>> matrix(numberOfRows, std::vector<int>(numberOfColumns, 0));
// Read values from user input
for (std::vector<int>& row : matrix) for (int& i : row)
std::cin >> i;
// Show output
for (const std::vector<int>& row : matrix) {
for (const int& i : row) std::cout << i << ' ';
std::cout << '\n';
}
}
这里也可以使用 std::istream_iterator
s 和范围构造函数。但是,正如所说。视情况而定。
如果它们有逗号分隔值,或者值中有白色 space,例如字符串,那么您需要使用其他机制。
最近我开始参加 c++ 竞赛,但我找不到处理这种格式的用户输入的最佳方法。
例如4和3是下一块输入的维度
4 3
1 2 4 5
1 6 7 4
1 5 0 0
我一直遇到的问题是,有时自动测试机可以成功测试它的输入,有时不能,目前我一直使用的方法是下一个
std::vector<std::vector<char>> vec;
void get_lines(std::string in) {
std::vector<char> line(in.begin(), in.end());
vec.push_back(line);
}
std::cin >> height >> width;//this is in main()
std::cin.ignore();
for (int i = 0; i < height; i++)
{
std::getline(std::cin, input);
get_lines(input);
input = "";
}
但我敢肯定这不是处理此类输入的最有效也不是最稳定的方法。
如何处理上述格式的用户输入,以便测试机可以轻松输入其值?
你可以这样做:
std::cin >> height >> width;
std::vector<std::vector<int>> vec;
vec.resize(height, vector<int>(width)); // resize
for(int i {0}; i < height; ++i)
{
for(int j {0}; j < width; ++j)
{
std::cin >> vec[i][j];
}
}
首先,对于您做出参加此类比赛的决定,我深表歉意。它将帮助您学习如何解决算法,但他们通常使用极其糟糕的编程风格。
总之。回到你的问题。一如既往。这取决于。如果您的数据仅由白色 space 分隔,您几乎可以使用带有提取器运算符“>>”的格式化输入函数。此运算符将忽略(跳过)标准模式下的所有白色 space,包括行尾的“新行”。因此,无需逐行阅读。
这个“竞赛页面”的好处是输入总是被认为是正确的。因此,您不需要进行输入错误检查或数据合理化。他们将始终使用一些测试环境,在那里他们通过输入重定向“推送”代码中的数据。在现实生活中,用户输入总是很容易出错,必须仔细检查。
你看,虽然不是必须的,但他们给出了矩阵的维度,以简化数据输入(这通常是没有必要的,因为我们可以自己找出)。
- 所以,首先阅读尺寸。
- 有了它,构建你的'std::vector'
- 然后使用 2 个基于嵌套范围的 for 循环来读取值
许多可能的示例之一可能如下所示:
#include <iostream>
#include <vector>
int main() {
// Define variables that will hold the dimension of the matrix
size_t numberOfRows{}, numberOfColumns{};
// Get user input, the dimension of the matrix
std::cin >> numberOfRows >> numberOfColumns;
// Define our container, including its size
std::vector<std::vector<int>> matrix(numberOfRows, std::vector<int>(numberOfColumns, 0));
// Read values from user input
for (std::vector<int>& row : matrix) for (int& i : row)
std::cin >> i;
// Show output
for (const std::vector<int>& row : matrix) {
for (const int& i : row) std::cout << i << ' ';
std::cout << '\n';
}
}
这里也可以使用 std::istream_iterator
s 和范围构造函数。但是,正如所说。视情况而定。
如果它们有逗号分隔值,或者值中有白色 space,例如字符串,那么您需要使用其他机制。