2016-06-14 5 views
0

Ich möchte einen 2D-Vektor (privat in einer Klasse) mit einer Größe 3xNmax initialisieren, wobei Nmax im Hauptbereich (außerhalb der Klasse) zugewiesen werden soll.Initialisiere einen Vektor in einer Klasse und übergebe seine Größe als Argument

Eigentlich habe ich:

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 

Muss ich die Deklaration und Initialisierung im Konstruktor bewegen?

EDIT1: Vielen Dank für Ihre Antworten. In Anbetracht der Tatsache, dass ich nicht die Variable _Nmax verwenden muss, (da die Vektoren mit ihm eine eigene Größe haben), dachte ich, dass ich den Vektor mit einer bestimmten festen Größe (Nmax) am Anfang deklarieren und vermeiden würde, ihn während der Die Codeausführung würde meinen Code schneller laufen lassen anstatt ihn mehrmals zu verwenden. "Push_back" Ist diese Annahme richtig?

+2

Es ist keine gute Idee, Ihre Variablennamen mit Unterstrichen zu beginnen. Es ist auch keine gute Idee, irrelevante Elementvariable zu haben, die die Anzahl der Elemente in dem Vektor angibt. Ein Vektor kennt seine eigene Größe, und die Einführung von "Helfer" -Variablen erhöht nur die Wahrscheinlichkeit, dass Fehler auftreten. – PaulMcKenzie

+0

@PaulMcKenzie Das Setzen eines führenden (oder nachgestellten) Unterstrichs, um eine Elementvariable zu bezeichnen, ist ziemlich üblich. Ich stimme Ihnen zu, dass die Variable in diesem Fall überflüssig ist. –

Antwort

1
#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

die Initialisierungsliste Verwendung:

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

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

Auch besteht keine Notwendigkeit, um eine Fremdelementvariable zu tragen _nMax die Anzahl der Elemente in einem Vektor zu bezeichnen. Ein Vektor kennt seine eigene Größe, indem er die vector::size() Funktion aufruft.

Die Einführung zusätzlicher Variablen, um diese Arbeit zu erledigen, erhöht die Wahrscheinlichkeit, dass Fehler auftreten, weil Dinge vergessen haben, diese Variable zu aktualisieren, wenn der Vektor die Größe ändert.

Es ist auch keine gute Idee, Ihre Variable mit Unterstrichen zu starten. Namen mit Unterstrichen sind für den Systembibliothekscode reserviert.

+0

prägnante Lösung. Vielleicht eine weitere Vektorinitialisierung, als wir es uns wünschen? –

Verwandte Themen