6

我昨天参加了一场编程比赛,我们必须阅读表格的输入

n
a1 a2 ... an
m
b1 b2 ... bm
...

其中第一行表示有多少输入,下一行包含那么多输入(并且所有输入都是整数)。

我知道如果每行有相同数量的输入(比如 3),我们可以写类似

while (true) {
    cin >> a1 >> a2 >> a3;
    if (end of file)
        break;
}

但是当每行可以有不同数量的输入时,你怎么做呢?

4

7 回答 7

8

这是仅使用标准库的简单示例:

#include <vector>       // for vector
#include <iostream>     // for cout/cin, streamsize
#include <sstream>      // for istringstream
#include <algorithm>    // for copy, copy_n
#include <iterator>     // for istream_iterator<>, ostream_iterator<>
#include <limits>       // for numeric_limits

int main()
{
    std::vector<std::vector<double>> contents;

    int number;
    while (std::cin >> number)
    {
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // skip eol
        std::string line;
        std::getline(std::cin, line);
        if (std::cin)
        {
            contents.emplace_back(number);
            std::istringstream iss(line);
            std::copy_n(std::istream_iterator<double>(iss), number, contents.back().begin());
        }
        else
        {
            return 255;
        }
    }

    if (!std::cin.eof())
        std::cout << "Warning: end of file not reached\n";

    for (auto& row : contents)
    {
        std::copy(row.begin(), row.end(), std::ostream_iterator<double>(std::cout," "));
        std::cout << "\n";
    }
}

在 Coliru上现场观看:输入

5
1 2 3 4 5
7 
6 7 8 9 10 11 12

输出:

1 2 3 4 5 
6 7 8 9 10 11 12
于 2013-08-23T17:52:01.950 回答
3

你可以这样做

#include<vector>
...
...
std::vector<sometype> a;
sometype b;
std::cin >> b;
while(std::cin)
{
 a.push_back(b);
 std::cin >> b;
}

您可以输入任意数量的项目,并在完成后发送 EOF 信号。

于 2013-08-23T18:10:16.793 回答
1

您的算法将如下所示:

1. read the 'number' of inputs, say n1
2. set up a loop to read the n1 inputs
3. check if the user has more inputs to give
   if YES repeat the steps 1,2 and 3 till all inputs are taken and stored.
   else move on...

您可以使用 for 或 while 循环并将输入存储到数组中。

希望这可以帮助!

于 2013-08-23T17:56:44.290 回答
1

因为人们抱怨我如何将我的第一个答案称为“简单的做法”,所以这是使用 Boost Spirit 的正确版本:

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>

int main()
{
    typedef std::vector<std::vector<double>> data_t;
    typedef boost::spirit::istream_iterator It;

    std::cin.unsetf(std::ios::skipws);
    It first(std::cin), last;

    bool ok;
    data_t contents;

    {
        using namespace boost::spirit::qi;
        static rule<It, data_t(),                        blank_type, locals<int>> file;
        static rule<It, std::vector<double>(int number), blank_type>              row;

        _a_type number; // friendly alias

        file %= -(omit [int_[number=_1]] > eol > row(number)) % eol;
        row   = repeat(_r1) [ double_ ];

        ok = phrase_parse(first, last, file, blank, contents);
    }

    if (ok) for (auto& row : contents)
    {
        std::copy(row.begin(), row.end(), std::ostream_iterator<double>(std::cout," "));
        std::cout << "\n";
    }

    if (first!=last)
        std::cout << "Warning: end of file not reached, remaining unparsed: '" << std::string(first, last) << "'\n";
}

显然是优越得多

  • 它使用更少的包含行:)
  • 编译需要大约 10 倍的时间(没有优化),再优化 16%
  • 它需要大约 5 年的元编程学习才能理解它(开玩笑,精神文档/教程还不错)
  • 严肃地说:它更灵活

    • 可以扩展解析其他结构元素,更复杂
    • 可以即时实现语义
    • 将正确解析 NaN 和 +/-infinity
    • 等等

也可以在 Coliru 上看到

于 2013-08-23T20:37:29.527 回答
1

鉴于您指定的格式,这就是我要做的。

for (int n; std::cin >> n; )
{
    if (n == 0)     // Test for end of input
        break;

    for (int i = 0; i != n; ++i)
    {
        int x;
        std::cin >> x;
        if (!std::cin)
            break;

        // Valid input x. Now do something with x like
        // v.push_back(x) where v is some vector of ints
    }
}

// Did we succeed?
if (!std::cin)
{
    // Something went bad.
    std::cerr << "Error reading input" << std::endl;

    return EXIT_FAILURE;
}
于 2014-09-05T16:48:22.463 回答
0

很简单,使用 for 循环和数组。

int a[MAX]; // programming problems usually specify a max size
for(i=0;i<n;i++)
cin>>a[i];
于 2013-08-23T17:46:25.087 回答
0

一个简单的解决方案,使用数组和动态内存分配来获取可变数量的预定义类型的输入。

#include<iostream>
using namespace std;

int main(){
int n;
cout<<"Enter the number of elements"<<endl;
cin>>n;
int *c=new int[n];
for(int k=0;k<n;k++)
    cin>>c[k];
delete c;
}
于 2018-02-09T17:32:40.417 回答