2017-12-27 2 views
1

Wenn ich mehrere Werte des gleichen Typs in C++ speichern muss, kann ich einen Vektor oder ein Array verwenden. Bisher habe ich hauptsächlich nur Vektoren verwendet, aber ich habe gehört, dass Arrays schneller arbeiten (Werte lesen und schreiben). Wenn das wahr ist, würde ich gerne wissen, wie ich ein Array mit der Größe machen könnte, die ich von der Standardeingabe gelesen habe. Ich zur Zeit so etwas wie folgt verwenden:C++ initialisiert ein Array mit der Größe von der Standardeingabe

int N; 
cin >> N; 
vector<int> myVector(N); 

ich versucht habe:

int N; 
cin >> N; 
array<int, N> myArray; 

aber das gibt mir einen Fehler, da:
Fehler: den Wert von ‚N‘ ist nicht verwendbar in einem konstanten Ausdruck
ich habe auch versucht:

int N; 
cin >> N; 
int myArray[N]; 

Diese kompilieren, aber wenn ich versuche, für die eine Größe von arra zu fragen y (myArray.size()) darüber ein iterieren mit for-Schleife dann erhalte ich einen Fehler:
Fehler: Anforderung für Element 'size' in 'myArray', die besteht aus nicht-Klassentyp 'int [N]'

Also sollte ich Vektoren durch Arrays ersetzen, um meinen Code schneller zu machen und wenn ja, wie soll ich das machen?

+1

*** sollte ich Ersetze Vektoren mit Arrays, um meinen Code schneller zu machen *** Nein, du brauchst ein dynamisches Array, also benutze einen Vektor. – drescherjm

+2

'std :: array's Geschwindigkeitsvorteil (und seine Größenbeschränkung für stack-basierte Objekte) kommt von der Tatsache, dass' std :: array's Größe zur Kompilierzeit bekannt ist und somit eine Zuordnung vermieden werden kann , noch wichtiger, eine Indirektion. Es kann einen Platz für eine "std :: array" -ähnliche Datenstruktur geben, die eine bekannte obere Größe, aber eine dynamische Größe bis zu diesem oberen likit aufweist. In der Standard-C++ - Bibliothek gibt es jedoch keine solche Datenstruktur. –

+1

'int myArray [N];' ist ein VLA. Dies ist kein legales C++, sondern eine Compiler-Erweiterung. Ich bezweifle, dass es sowieso schneller als Vektor ist und es macht Ihren Code nur auf Compiler, die diese nicht standardmäßige Erweiterung unterstützen. – drescherjm

Antwort

1

N sollte zur Kompilierzeit bekannt sein. Wenn Sie also array für E/A-Operationen verwenden möchten, sollten Sie die maximale Anzahl von int s angeben, die gelesen werden darf. Außerdem sollten Sie die Anzahl der gelesenen Ganzzahlen selbst verfolgen. Keine

So should I replace vectors with arrays to make my code faster and if so the how should I do it?

, weil operator>> würde der Engpass in Ihrem Fall sein. Und mit vector zu arbeiten, wenn die Nummer int s nicht bekannt ist, ist in Ordnung.

0

Ein Array ist kein Objekt in C++, daher gibt es keine Funktion .size(). Sie sollten stattdessen eine andere Variable haben, die ihre Größe hält.

int* array = new int[size]; 

es ist der Weg. Aber Sie sollten gute Gründe haben, dies als Vektor zu tun, es ist viel sicherer und einfacher zu bedienen.

nach dem Array Sie es löschen müssen:

delete [] array; 

und erinnern Sie sich immer ein Array aus einem Vektor erhalten kann nur durch die vector :: Daten() -Funktion

+3

Alles andere ist gut ... aber ich habe den letzten Punkt abgelehnt, was gefährlich falsch ist. Kompiliert das überhaupt? Es sollte nicht, denn das ist keine gültige implizite Besetzung.Wie auch immer, 'std :: vector' bietet keinen überschriebenen' Operator & ', der auf seinen Puffer zugreifen würde, und sollte es auch nicht. Wenn dieser Code * auf Ihrem Compiler * passiert ist, dann (A) habe ich keine Ahnung, wie und (B) Sie diesen Code sofort ersetzen müssen, weil er nicht funktionieren sollte und in jedem Moment schrecklich explodieren könnte. –

+0

@underscore_d Ich denke, er meinte die 'vector :: data()' Funktion. Das wäre tatsächlich ein Zeiger auf das zugrunde liegende Datenfeld. http://en.cppreference.com/w/cpp/container/vector/data – DNK

+1

Richtig und -1 entfernt. Natürlich wird dieses zugrundeliegende Array durch den 'Vektor' verwaltet, so dass wir es nicht in allen Fällen ersetzen können, in denen ein unformatiertes Array verwendet würde, insbesondere wenn es versuchen würde, es zu" löschen ". Ich denke, es ist das Beste, nur ".data()" zu verwenden, um an APIs zu übergeben, die einen rohen Zeiger erwarten, und vorzugsweise eine "const", die sie nur lesen. Alles andere bittet um Ärger und vereitelt den Punkt der Verwendung von 'vector' etwas. Dennoch gibt es Fälle, in denen es bequem ist, '.data()' zu verwenden und zu schreiben, aber ich denke, sie sind am besten auf diejenigen beschränkt, die den Vektor erstellen und seine Größe beibehalten. –

Verwandte Themen