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

あなたが指定しているフォーマットを考えると、ここに私がすることがあります。

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 に答える
1

私が最初の答えを「単純なテイク」と呼んだことに人々が不満を持っていたので、ブースト スピリットを使用した適切なバージョンを次に示します。

#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 に答える
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 に答える