2010-03-05 4 views
2

Ce code fonctionne:C++ transformer avec une paire se Segmentation faute

class Test 
{ 
public: 
    Test(string name) : _name(name) {}; 
    bool operator()() { cout << "hello " << _name << endl; return true; } 
    string name() { return _name; } 
private: 
    string _name; 
}; 

pair<string, bool> 
inline execute_test(Test* t) { 
    return pair<string, bool>(t->name(), (*t)()); 
} 

int main() 
{ 
    vector<Test*> tests; 
    vector<pair<string, bool> > results; 
    tests.push_back(new Test("Test1")); 
    tests.push_back(new Test("Test2")); 

    for (unsigned int i=0; i < tests.size(); ++i) 
     results.push_back(execute_test(tests[i])); 

} 

maintenant je veux utiliser trasform au lieu de pour cicle:

transform(tests.begin(), tests.end(), 
      results.begin(), 
      execute_test); 

mais je a eu une erreur de segmentation. Où est le problème?

Répondre

9

C'est parce que transform attend results objet d'avoir la mémoire requise allouée à-dire qu'il attend results.size() est atleast aussi grand que tests.size(). Si vous voulez que l'opération push_back soit effectuée sur le results, vous devez utiliser std::back_inserter(results) comme troisième argument. Sinon, lorsque transform utilise l'itérateur de sortie que vous avez transmis, il s'agit d'un emplacement de mémoire non valide et il en résulte une erreur de segmentation.

+0

Merci beaucoup. Je dois relire quelques livres de stl ... –

Questions connexes