2010-03-29 3 views
2
#include <iostream> 
#include <algorithm> 
#include <vector> 
#include <boost/array.hpp> 
#include <boost/bind.hpp> 

int main() { 
    boost::array<int, 4> a = {45, 11, 67, 23}; 
    std::vector<int> v(a.begin(), a.end()); 
    std::vector<int> v2; 
    std::transform(v.begin(), v.end(), v2.begin(), 
    boost::bind(std::multiplies<int>(), _1, 2)); 
    std::copy(v2.begin(), v2.end(), std::ostream_iterator<int>(std::cout, " ")); 
} 

Lors de l'exécution, cela donne un défaut de segmentation effrayant. S'il vous plaît dites-moi où je vais mal.Quel est le bogue dans le code suivant?

+2

essayé le débogage? – Tom

+1

@Tom: Désolé mais je suis C++ newbie; il me faudrait un peu de temps pour me familiariser avec tous les cas de bords en STL. – Johannes

+2

qu'est-ce qu'une 'erreur de segmentation effrayante'? – KevinDTimm

Répondre

12

v2 a une taille de zéro lorsque vous appelez transform. Vous avez besoin soit de redimensionner v2 de sorte qu'il a au moins autant d'éléments que v avant l'appel à transform:

v2.resize(v.size()); 

ou vous pouvez utiliser std::back_inserter dans l'appel à transform:

std::transform(v.begin(), v.end(), std::back_inserter(v2), boost::bind(std::multiplies<int>(), _1, 2)); 
+0

Et le mieux est probablement de 'v2.reserve (v.size())' d'abord avant un 'transform'. – GManNickG

Questions connexes