2010-07-26 3 views
1

Je l'expérience d'un segfault sur le code suivant:Segfault sur l'utilisation de transformation sur un vecteur de pointeurs vers une classe abstraite

je une classe abstraite A avec une méthode

virtual bool Ok() const; 

Maintenant, je le vecteur suivant

std::vector<A*> v; 

rempli avec plusieurs pointeurs vers des objets enfants existants. Je veux accumuler les résultats de la méthode Ok() comme suit:

std::vector<bool> results; 
std::transform(v.begin(), v.end(), results.begin(), std::mem_fun(&A::Ok)); 
std::accumulate(results.begin(), results.end(), true, std::logical_and<bool>()); 

Malheureusement, je reçois toujours une erreur de segmentation sur la deuxième ligne, et je ne comprends pas pourquoi. Le remplacement de l'appel de transformation par une boucle C++ standard corrige le segfault. Des idées?

Répondre

4

Le vecteur results est vide et transform ne sait pas que vous souhaitez que les résultats soient insérés dessus plutôt que d'écraser une séquence existante.

Soit Initialiser le vecteur results avec la taille correcte:

std::vector<bool> results(v.size()); 

ou utilisez un iterator « insert arrière » pour pousser les résultats sur le vecteur vide:

std::transform(v.begin(), v.end(), std::back_inserter(results), std::mem_fun(&A::Ok)); 
+0

Merci. Il s'avère que ma propre explication était plutôt confuse et erronée. Vous avez parfaitement raison, bien sûr! – lytenyn

+0

J'ai découvert comment corriger ma propre explication. Je vais marquer votre réponse comme la bonne, une fois que je peux le faire, bien sûr. – lytenyn

2

C'est peut-être stupide, mais je répondrai directement à ma propre question. J'ai trouvé le problème peu de temps avant de cliquer sur "posez votre question" et je me suis dit que, puisque j'ai déjà tout tapé, je pourrais aussi poster la réponse, pour que quelqu'un d'autre puisse en profiter:

La réponse est, que le le vecteur est vide et donc l'insertion à results.begin() est une chose assez bête à faire. Au lieu de cela, utilisez std::back_inserter(results) et tout fonctionne bien!

+0

Vous pouvez également marquer votre réponse comme le bon. – MKroehnert

+1

Le redimensionnement des résultats et l'utilisation de 'begin()' se passeraient bien. Rappelez-vous qu'il y a beaucoup de choses qui ne vont pas avec 'vector '. – pmr

Questions connexes