2017-10-17 3 views
1

나는 1500 값의 벡터를 랜덤 화하기 위해 다음 코드를 가지고있다. (텍스트 파일에 넣기를 원하지만 할 수는 없다. 솔직히이 코드의 작동 방식을 완전히 이해하지 못했기 때문에 다른 사람이 작동 방식 및/또는 출력을 파일로 변경하는 방법을 설명해 주시기 바랍니다.ostream_iterator를 사용하여 파일을 인쇄하는 방법은 무엇입니까?

#include <iostream> 
#include <random> 
#include <algorithm> 
#include <iterator> 
#include <fstream> 

int main() { 
    std::vector<int> v; 
    for (int i; i<1500; ++i){ 
     v.push_back(i); 
    } 

    std::random_device rd; 
    std::mt19937 g(rd()); 

    std::shuffle(v.begin(), v.end(), g); 

    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " ")); 
    std::cout << "\n"; 

    return 0; 
} 
+3

'표준 : ostream_iteartor '는 객체를 리턴하는 반복자이며 할당시 스트림에 쓰는'operator *()'에서 시작하여 문자열 분리 기호가옵니다. 'std :: copy()'는 소스 시퀀스의 각 요소를 대상 시퀀스의 객체에 할당합니다. 즉, 각 객체는 스트림에 기록됩니다. 'std :: cout'을'std :: ofstream' 객체로 대체하면 대상 파일에 쓸 수 있습니다. –

답변

2

std::cout의 종류 std::ostream_iterator가 동작하는 것과 동일한 유형 std::ofstream 모두 std::ostream으로부터 유도되는 유형 :

#include <iostream> 
#include <random> 
#include <algorithm> 
#include <iterator> 
#include <fstream> 

void emit_values(std::ostream& os) 
{ 
    std::vector<int> v; 
    for (int i = 0; i<1500; ++i){ 
     v.push_back(i); 
    } 

    std::random_device rd; 
    std::mt19937 g(rd()); 

    std::shuffle(v.begin(), v.end(), g); 

    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(os, " ")); 
    os << "\n"; 
} 

int main() 
{ 
    // use stdout 
    emit_values(std::cout); 

    // use a file 
    std::ofstream fs("values.txt"); 
    emit_values(fs); 
    fs.close();  

    return 0; 
} 
관련 문제