2012-04-30 2 views
2

Je suis en train de copier les données vectorielles sample-Y comme ci-dessouscopie à vecteur donnant segfault

std::map<std::string, std::vector<double > >sample; 
std::map<std::string, std::vector<double > >::iterator it1=sample.begin(), end1=sample.end(); 
std::vector<double> Y; 

et suis en utilisant le code suivant:

while (it1 != end1) { 
    std::copy(it1->second.begin(), it1->second.end(), std::ostream_iterator<double>(std::cout, " ")); 
++it1; 
} 

Il imprime la sortie ok, mais quand je remplace le bloc std :: copy ci-dessus avec le ci-dessous, je reçois un segfault.

while (it1 != end1) { 
std::copy(it1->second.begin(), it1->second.end(), Y.end()); 
++it1; 
} 

Je veux juste copier le contenu de it1-> seconde à Y. Pourquoi est-il ne fonctionne pas et comment puis-je résoudre ce problème?

Répondre

11

Évidemment, vous voulez insérer des objets dans votre vecteur. Cependant, std::copy() prend simplement les itérateurs passés et leur écrit. Les itérateurs obtenus par les itérateurs begin() et end() n'effectuent aucune insertion. Ce que vous voulez utiliser est quelque chose comme ceci:

std::copy(it1->second.begin(), it1->second.end(), std::back_inserter(Y)); 

Le modèle de fonction est une fonction std::back_inserter() d'usine pour un itérateur en utilisant push_back() sur son argument pour ajouter des objets.

+0

merci pour le raisonnement. ça a marché – user1155299

0
#include <iostream> 
#include <vector> 
#include <algorithm> 

using namespace std; 


int main() { 
    // your code goes here 
    vector<int> vec; 
    vector<int> test; 
    vec.push_back(1); 
    //test.push_back(0); 
    copy(vec.begin(),vec.begin()+1,test.begin()); 
    cout << *(test.begin()); 
    return 0; 
} 

sortie: Durée du temps d'erreur: 0 mémoire: Signal 3424: 11

#include <iostream> 
#include <vector> 
#include <algorithm> 

using namespace std; 


int main() { 
    // your code goes here 
    vector<int> vec; 
    vector<int> test; 
    vec.push_back(1); 
    test.push_back(0); 
    copy(vec.begin(),vec.begin()+1,test.begin()); 
    cout << *(test.begin()); 
    return 0; 
} 

sortie: * temps Succès: 0 mémoire: Signal 3428: 0 *

#include <iostream> 
#include <vector> 
#include <algorithm> 

using namespace std; 


int main() { 
    // your code goes here 
    vector<int> vec; 
    vector<int> test(5); 
    vec.push_back(1); 
    //test.push_back(0); 
    copy(vec.begin(),vec.begin()+1,test.begin()); 
    cout << *(test.begin()); 
    return 0; 
} 

temps Succès: 0 mémoire: Signal 3428: 0

SO la raison est que vous ne l'avez pas initilize le vecteur, le point vector.begin() à quelque part restreint! lorsque vous utilisez un back_inserter (vector), il renvoie un back_insert_interator qui utilise en interne un vector.push_back plutôt qu'une opération * (deference). Donc, back_inserter fonctionne!

Questions connexes