2017-10-17 3 views
1

Je ai le code suivant (mooched de here) pour randomiser un vecteur de 1500 valeurs, et je veux les placer dans un fichier texte, mais ne peut pas. Honnêtement, je ne comprends pas très bien comment ce code fonctionne, donc j'aimerais que quelqu'un m'explique comment cela fonctionne et/ou comment changer la sortie dans un fichier.Comment imprimer en utilisant 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

std :: '' ostream_iteartor est un itérateur renvoyant un objet from 'operator *()' qui écrit dans un flux lors de l'affectation, suivi du séparateur de chaîne. 'std :: copy()' affecte chaque élément de la séquence source à un objet dans la séquence de destination, c'est-à-dire que chaque objet est écrit dans le flux. Il suffit de remplacer 'std :: cout' par un objet de' std :: ofstream' ouvert pour écrire dans le fichier cible. –

Répondre

2

Le type de std::cout et du type std::ofstream sont tous deux dérivés de std::ostream, qui est du même type que std::ostream_iterator fonctionne sur:

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