2011-01-26 4 views
1

Ceci est ma première question. J'ai abandonné et j'utiliserai un foncteur roulé à la main pour cela, mais je suis curieux de savoir comment il est censé être fait. L'exemple inventé ci-dessous est destiné à redimensionner tous les vecteurs d'un vecteur de taille 9, en les remplissant de zéros. La ligne indiquée provoque MinGW GCC 4.5.0 à cracher beaucoup d'erreurs de modèle. J'ai essayé plusieurs permutations différentes, mais seulement affiché le code que je considère comme "plus proche de corriger" ci-dessous. Comment devrait-il être écrit? Remarque, je souhaite conserver la version à deux arguments de redimensionner.for_each lier le vecteur de redimensionner le vecteur

#include <vector> 
using std::vector; 
#include <algorithm> 
using std::for_each; 
#include <tr1/functional> 
using std::tr1::bind; 
using std::tr1::placeholders::_1; 

int main() { 
vector<vector<void *> > stacked_vector(20); 
for_each(stacked_vector.begin(),stacked_vector.end(), 
    bind(&std::vector<void *>::resize,_1,9,0/*NULL*/)); // voluminous error output 
return 0; 
} 

Nous vous remercions de votre participation.

Répondre

1

Il est difficile de dire sans voir la sortie d'erreur (et franchement, même avec elle). Cependant, essayez de passer la valeur NULL en tant que void* type: static_cast<void*>(0). Sinon, l'objet renvoyé par bind essaie de donner une valeur int en tant que second paramètre à resize.

+0

La réponse d'Amnon a fonctionné pour moi. Pour ceux qui cherchent l'approche foncteur, je l'ai fait ce qui suit: modèle classe resize_functor { public: \t resize_functor (taille size_t, la valeur T): size_ (taille), VALUE_ (valeur) {}; \t modèle opérateur vide() (C & conteneur) { \t \t container.resize (size_, value_); \t} privé: \t size_t size_; \t T valeur_; }; For_each (stacked_vector.begin(), stacked_vector.end(), resize_functor (9u, 0)); –

+0

Souhaite que je pourrais voir comment ajouter des balises de code dans les commentaires ... –

0

Essayez ceci.

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


int main() 
{ 
    typedef std::vector<int> vec_int; 
    typedef std::vector<vec_int> vec_vec_int; 

    // Do this to make the _1 work 
    using namespace std::placeholders; 

    static const int FIRST_DIM = 5; 
    static const int SECOND_DIM = 10; 
    static const int DEFAULT_VALUE = 66; 

    vec_vec_int v(FIRST_DIM); 

    std::for_each(v.begin(), v.end(), 
     std::bind(&vec_int::resize, _1, SECOND_DIM, DEFAULT_VALUE)); 

    std::cout << v[4][9]; 

    return (0); 
} 

Si vous ne souhaitez pas spécifier la valeur par défaut, vous n'avez pas besoin de le faire.