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_iterators 和范围构造函数。但是,正如所说。视情况而定。

如果它们有逗号分隔值,或者值中有白色 space,例如字符串,那么您需要使用其他机制。