2012-12-06 15 views
5

ich einen Code haben, wie folgt:ersetzen `std :: VECTOR` mit` std :: array`

int n; 

int get_the_number(); 
void some_computations(); 

int main() 
{ 
    n = get_the_number(); 
    some_computations() 

    return(0); 
} 
  • Die get_the_number Funktion eine Eingabe erhalten und gibt die ganze Zahl n, die nach dem Aufruf wird nicht geändert.

  • In der some_computation Funktion gibt es den folgenden Code

    std::vector<my_struct> my_array; 
    
    for(int i=0; i<n; i++) 
    { 
        my_struct struct_temp; 
    
        // fill struct_temp; 
    
        my_array.push_back(struct_temp); 
    } 
    

Frage: Da die Größe my_array a priori bekannt ist, ist es möglich, die std::vector mit einem std::array zu ersetzen? Sollte ich darüber hinaus im positiven Fall einen Effizienzgewinn erwarten?

Ich versuchte, die Vektor-Deklaration mit

std::array<my_struct,n> my_array; 

aber ich erhalte eine Fehlermeldung zu ersetzen: die Größe des Arrays muss konstant sein. Gibt es eine Möglichkeit, es zu vermeiden?

Vielen Dank.

Antwort

11

muss die Größe bei kompilieren Zeit, die nicht für Ihren Code gilt. Also nein, Sie können std::vector hier einfach nicht durch std::array ersetzen, es sei denn, get_the_number() kann zum Beispiel eine constexpr zurückgeben.

constexpr int get_the_number() { return 42; } 

int main() 
{ 
    std::array<int, get_the_number()> a; 
} 

Aber vermutlich in Ihrem Fall int get_the_number() erhält eine Nummer zur Laufzeit bestimmt.

+0

sieht aus wie ich nicht schnell genug tippen. :) –

+0

Vielen Dank für die schnelle und klare Antwort. Ich wusste vorher nichts von constexpr: Ich muss viel lernen! – 888

5

Wenn Sie die Tatsache, dass Ihre Array-Länge verwenden wollen, ist ein Laufzeit konstant zu die Effizienz zu verbessern, was Sie tun möchten, ist std::vector::reserve zu Reserve den notwendigen Raum vor der Zeit verwenden Sie sparen Neuzuordnungen, wenn der Vektor wächst - das sollte es fast so schnell machen wie ein array.

my_array.reserve(get_the_number()); 
some_computations() 

Oder wenn Array lokal für die Funktion ist, übergeben Sie die Zahl als Parameter.

+0

Der Grund dafür, dass 'std :: vector :: reserve' nicht so schnell ist wie' std :: array', liegt darin, dass es auf dem Heap anstatt auf dem Stack zugewiesen wird. Ein Stack-Allocater für 'std :: vector' könnte es fast bis zu' std :: array' bringen, obwohl es ein Benchmark sein müsste. – Ricky65