2016-11-19 1 views
0

J'ai une carte STL de type <string, int>, je dois copier cette carte dans un fichier, mais je vais avoir du mal à mettre le type de ostream_iteratorUtiliser ostream_iterator pour copier une carte dans le fichier

map<string, int> M; 

ofstream out("file.txt"); 
copy(begin(M), end(M), ostream_iterator<string, int>(out , "\n")); 

Error message error: no matching function for call to 'std::ostream_iterator, int>::ostream_iterator(std::ofstream&, const char [2])'|

puisque la carte M est un type, pourquoi ostream_iterator ne prend-il pas son type?

+0

connexes: http://stackoverflow.com/questions/634087/stdcopy-to-stdcout-for-stdpair –

Répondre

2

Si vous regardez attentivement la déclaration de std :: ostream_iteratorhere, vous remarquerez que votre utilisation de std :: ostream_iterator est incorrect parce que vous devez spécifier le type d'éléments imprimés comme le premier paramètre de modèle.

Le type d'éléments dans le std :: carte M est std :: pair < const std :: string, int>. Mais vous ne pouvez pas mettre std :: pair < const std :: string, int> comme premier paramètre de modèle car il n'y a pas moyen d'imprimer par défaut une std :: pair.

Une solution possible est d'utiliser std :: for_each et lambda:

std::ofstream out("file.txt"); 

std::for_each(std::begin(M), std::end(M), 
    [&out](const std::pair<const std::string, int>& element) { 
     out << element.first << " " << element.second << std::endl; 
    } 
);