2012-09-20 19 views
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循環(例如,使用複製()算法和插入器?)。

當運行時讀取元素的數量時(如在變量'n'中,這裏),我還沒有找到一種方法來做到這一點。

+2

用['的std :: copy_n'](HTTP://en.cppreference的.com /瓦特/ CPP /算法/ copy_n)。但是你的代碼因爲沒有防守的輸入而被破壞了,讀'n'或'x'通常是未定義的行爲。 –

+0

謝謝。代碼沒有被破壞;我有意識地選擇在輸入錯誤的情況下接受未定義的行爲。 – reddish

+0

任何方式在C++ 98中做到這一點? – reddish

回答

2

這裏是ndouble的拷貝爲載體的一種方法:

#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);