3

次のプログラムがあるとします。

#include <vector>
#include <iostream>

using namespace std;

int main()
{
    unsigned n;
    vector<double> xvec;

    cin >> n;
    while (xvec.size() < n)
    {
        double x;
        cin >> x;
        xvec.push_back(x);
    }

    return 0;
}

STLを使用して、明示的なwhileループなしでこれを記述する方法はありますか(たとえば、copy()アルゴリズムとインサーターを使用しますか?)。

実行時に要素の数が読み取られるときにこれを行う方法が見つかりませんでした(ここでは変数「n」のように)。

4

1 に答える 1

2

n doublesをベクトルにコピーする1つの方法は次のとおりです。

#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>

int main()
{
    unsigned n;
    std::vector<double> xvec;

    std::cin >> n;
    xvec.reserve(n);
    std:generate_n(std::back_inserter(xvec), n,
      []() { double d; std::cin >> d; return d; });

    std::copy(xvec.begin(), xvec.end(),
      std::ostream_iterator<double>(std::cout, " "));

    std::cout << "\n";

    return 0;
}

:この代替方法std::copy_nは機能しません:

std::copy_n(std::istream_iterator<double>(std::cin),
    n,
    std::back_inserter(xvec));

これは実際にはn+1要素を読み取りますが、それらのコピーのみを読み取りnます(少なくともg ++ 4.6.3では)。


注2:答えをC ++ 98に限定すると、考えられる解決策の1つが次のようになります。

double GetD() { double d; std::cin >> d; return d; }
...
std:generate_n(std::back_inserter(xvec), n, GetD);
于 2012-09-20T16:59:23.057 に答える