it-swarm.com.de

Konvertierung zwischen C++ std :: vector und C-Array ohne Kopieren

Ich möchte in der Lage sein, zwischen std :: vector und seinem zugrunde liegenden C-Array int * zu konvertieren, ohne die Daten explizit zu kopieren. 

Bietet std :: vector Zugriff auf das zugrunde liegende C-Array? Ich suche so etwas 

vector<int> v (4,100)
int* pv = v.c_array();

BEARBEITEN:

Ist es auch möglich, das Gegenteil zu tun, d. H. Wie würde ich einen std::vector von einem C-Array aus initialisieren, ohne zu kopieren?

int pv[4] = { 4, 4, 4, 4};
vector<int> v (pv);
49
dzhelil

Sie können einen Zeiger auf das erste Element wie folgt erhalten:

int* pv = &v[0];

Dieser Zeiger ist nur gültig, solange der Vektor nicht neu zugewiesen wird. Die Neuzuordnung erfolgt automatisch, wenn Sie mehr Elemente einfügen, als in die verbleibende Kapazität des Vektors passen (dh, wenn v.size() + NumberOfNewElements > v.capacity(). Sie können v.reserve(NewCapacity) verwenden, um sicherzustellen, dass der Vektor eine Kapazität von mindestens NewCapacity hat.

Denken Sie auch daran, dass bei der Zerstörung des Vektors auch das darunterliegende Array gelöscht wird.

80
James McNellis
int* pv = &v[0]

Beachten Sie, dass dies nur für std::vector<> der Fall ist. Sie können dies nicht mit anderen Standardcontainern tun.

Scott Meyers behandelt dieses Thema ausführlich in seinen Büchern.

19
Ðаn

In c ++ 11 können Sie vector :: data () verwenden, um einen C-Arrayzeiger zu erhalten.

19
m.elahi

Wenn Sie sehr kontrollierte Bedingungen haben, können Sie einfach Folgendes tun:

std::vector<int> v(4,100);
int* pv = &v[0];

Seien Sie gewarnt, dass dies nur funktionieren wird, solange der Vektor nicht wachsen muss und der Vektor die Lebensdauer des zugrunde liegenden Arrays immer noch verwaltet (dh pv nicht löschen). Dies ist nicht ungewöhnlich, wenn Sie zugrunde liegende C-APIs aufrufen. Dies geschieht jedoch normalerweise mit einem unbenannten temporären Element, anstatt eine explizite int * -Variable zu erstellen.

15
Drew Hall

Eine Möglichkeit, sich vor Größenänderungen zu schützen, besteht darin, den maximal erforderlichen Speicherplatz (oder mehr) zu reservieren:

std::vector<int> v(4,100); //Maybe need 
v.reserve(40);             //reallocate to block out space for 40 elements

Dadurch wird sichergestellt, dass Push_backs keine Neuzuweisung der vorhandenen Daten verursacht.

0
user1270710