Je veux initialiser un vecteur 2D (privé dans une classe) avec une taille 3xNmax, avec Nmax à affecter dans le principal (en dehors de la classe).

En fait, j'ai:

class Particle
{
public:
   Particle();

   void setNmax(float Nmax){
     _Nmax=Nmax; // this method is actually useless: _Nmax is set below
   }

private:

   int _Nmax=30000; // The parameter I want to set from outside

   vector<vector<float> > _x{3, vector<float> (_Nmax)}; //the 2D vector to be initialized

Dois-je déplacer la déclaration et l'initialisation dans le constructeur ?

EDIT1 : Merci pour vos réponses. Concernant le fait que je n'ai pas besoin d'utiliser la variable _Nmax, (puisque les vecteurs emportent avec lui sa propre taille), j'ai pensé qu'en déclarant le vecteur avec une certaine taille fixe (Nmax) au départ et en évitant de le redimensionner pendant la l'exécution du code rendrait mon code plus rapide au lieu d'utiliser plusieurs fois "push_back" Cette hypothèse est-elle correcte ?

0
Pier 14 juin 2016 à 19:34

2 réponses

Meilleure réponse
#include <vector>

class Particle
{
public:
   Particle(std::size_t nmax = 30000)
     : _Nmax(nmax)
     , _x { std::vector<float>(nmax),
            std::vector<float>(nmax),
            std::vector<float>(nmax)
          }
  {
  }


   void setNmax(std::size_t Nmax)
   {
     _Nmax = Nmax;
     for (auto& e : _x) {
       e.resize(Nmax);
     }
   }

private:

   std::size_t _Nmax=30000; // The parameter I want to set from outside

   std::vector<std::vector<float> > _x; //the 2D vector to be initialized
};
1
Richard Hodges 14 juin 2016 à 19:52

Utilisez la liste d'initialisation des membres :

#include <vector>
class Particle
{
    public:
       Particle(size_t Nmax = 30000) : xVect(3, std::vector<float>(Nmax)) {}

    private:
       vector<vector<float> > xVect;
};

De plus, il n'est pas nécessaire de transporter une variable membre externe _nMax pour désigner le nombre d'éléments dans un vecteur. Un vecteur connaît sa propre taille en appelant la fonction vector::size().

L'introduction de variables supplémentaires pour effectuer ce travail augmente les risques de bogues dus à des choses comme l'oubli de mettre à jour cette variable si le vecteur change de taille.

De plus, ce n'est pas une bonne idée de commencer votre variable par des traits de soulignement. Les noms avec des traits de soulignement sont réservés au code de la bibliothèque système.

1
PaulMcKenzie 14 juin 2016 à 19:49