Ein Array in einen std :: vector kopieren

8

Ich habe nach diesem Thema gesucht und viele Wege gefunden, ein Array [] in einen std :: Vektor umzuwandeln, wie zum Beispiel:

%Vor%

oder direkt im Konstruktor:

%Vor%

Diese lösen mein Problem, aber ich frage mich, ob es möglich (und korrekt) ist:

%Vor%

Ich frage mich, weil ich den folgenden Code habe:

%Vor%

Und ich würde gerne tun:

%Vor%

(Ich habe die Fehlerbehandlung der ReadFile-Funktion entfernt, um den Post zu vereinfachen).

Es funktioniert, aber ich habe Angst, dass es nicht sicher ist. Ich glaube, es ist in Ordnung, da der Speicher, den der Vektor verwendet, kontinuierlich ist, aber ich habe noch nie jemanden gesehen, der Vektoren auf diese Weise verwendet.

Stimmt es, Vektoren wie diese zu verwenden? Gibt es eine andere bessere Option?

    
Renan Greinert 15.01.2012, 17:12
quelle

6 Antworten

8

Ja, es ist sicher mit std::vector C ++ - Standard garantiert, dass die Elemente an zusammenhängenden Speicherorten gespeichert werden.

C ++ 11 Standard:

23.3.6.1 Übersicht über den Klassenvorlagenvektor [vector.overview]

  

Ein Vektor ist ein Sequenzcontainer, der Direktzugriffs-Iteratoren unterstützt. Darüber hinaus unterstützt seine (amortisierte) konstante Zeit Operationen am Ende einfügen und löschen; Einfügen und Löschen in der Mitte nehmen lineare Zeit. Die Speicherverwaltung wird automatisch durchgeführt, obwohl Hinweise zur Verbesserung der Effizienz gegeben werden können. Die Elemente eines Vektors werden zusammenhängend gespeichert , was bedeutet, dass ifv ein Vektor ist, wobei T ein anderer Typ als bool ist, dann folgt er der Identität & amp; v [n] == & amp; v [0] + n für all0 & lt; = n & lt; v.größe ().

    
Alok Save 15.01.2012, 17:17
quelle
5

Ja, es ist in Ordnung, das zu tun. Sie können myvet.data() anstelle von &myvet[0] verwenden, wenn es für Sie besser aussieht, aber beide haben den gleichen Effekt. Wenn die Umstände dies zulassen, können Sie stattdessen std::copy verwenden und mehr Typsicherheit und all die anderen C ++ - Standardbibliotheks-Goodies haben.

Der Speicher, den ein vector verwendet, ist garantiert zusammenhängend, wodurch er sich als Puffer oder mit anderen Funktionen eignet.

Stellen Sie sicher, dass Sie vector nicht ändern (z. B. push_back darauf aufrufen usw.), während Sie den Zeiger verwenden, den Sie von data oder &v[0] erhalten, weil die vector die Größe ändern könnte sein Puffer auf einer dieser Operationen und den Zeiger ungültig machen.

    
Seth Carnegie 15.01.2012 17:18
quelle
3

Dieser Ansatz ist korrekt, er hängt nur davon ab, dass der Vektor einen zusammenhängenden Speicher hat, der vom Standard benötigt wird. Ich glaube, dass es in C ++ 11 eine neue data() -Memberfunktion in Vektoren gibt, die einen Zeiger auf den Puffer zurückgibt. Beachten Sie auch, dass Sie im Falle von 'memcpy die Größe in Bytes und nicht die Größe des Arrays übergeben müssen.

    
quelle
2

Der Speicher in vector wird garantiert zusammenhängend zugewiesen, und vorzeichenloses Zeichen ist POD, daher ist es absolut sicher, in memcpy hineinzugelangen (vorausgesetzt, du kopierst nicht mehr als du zugeteilt hast, natürlich).

    
celtschk 15.01.2012 17:17
quelle
1

Ändern Sie die Größe zuerst zuerst , und es sollte gut funktionieren.

%Vor%     
TheBuzzSaw 15.01.2012 17:16
quelle
1

Ja, die Lösung mit memcpy ist korrekt; Der von vector gehaltene Puffer ist zusammenhängend. Aber es ist nicht ganz typsicher, also lieber assign oder std::copy .

    
Fred Foo 15.01.2012 17:17
quelle

Tags und Links