将输入流中固定数量的元素复制到矢量中

时间:2012-09-20 15:50:45

标签: c++ stl

鉴于以下计划:

#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',此处)。

1 个答案:

答案 0 :(得分:2)

以下是将n double复制到向量中的一种方法:

#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的答案,这是一个可能的解决方案:

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