54 votes

Conversion entre C ++ std :: vector et C array sans copier

Je voudrais pouvoir convertir entre std :: vector et son tableau C sous-jacent int * sans copier explicitement les données.

Std :: vector fournit-il un accès au tableau C sous-jacent? Je cherche quelque chose comme ça

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

MODIFIER:

Aussi, est-il possible de faire l'inverse, c'est-à-dire comment initialiser un std::vector partir d'un tableau C sans copier?

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

85voto

James McNellis Points 193607

Vous pouvez obtenir un pointeur vers le premier élément comme suit:

int* pv = &v[0];

Ce pointeur n'est valable que tant que le vecteur n'est pas réaffecté. La réaffectation se fait automatiquement si vous insérez plusieurs éléments ne peuvent pas être dans le vecteur de la capacité restante (qui est, si l' v.size() + NumberOfNewElements > v.capacity(). Vous pouvez utiliser v.reserve(NewCapacity) afin d'assurer le vecteur a une capacité d'au moins NewCapacity.

Rappelez-vous aussi que lorsque le vecteur est détruit, le tableau est supprimé ainsi.

21voto

m.elahi Points 43

Dans c ++11, vous pouvez utiliser vector :: data () pour obtenir un pointeur de tableau C.

20voto

Dan Points 3922
 int* pv = &v[0]
 

Notez que ce n'est le cas que pour std::vector<> , vous ne pouvez pas faire la même chose avec d'autres conteneurs standard.

Scott Meyers couvre ce sujet de manière approfondie dans ses livres.

16voto

Drew Hall Points 15917

Si vous avez des conditions très contrôlées, vous pouvez simplement faire:

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

Soyez averti que cela ne fonctionnera que tant que le vecteur n'aura pas à grandir et qu'il gèrera toujours la durée de vie du tableau sous-jacent (c'est-à-dire, ne supprimez pas pv). Ce n'est pas une chose rare à faire lorsque vous appelez des API C sous-jacentes, mais cela se fait généralement avec un temporaire non nommé plutôt que de créer une variable int * explicite.

0voto

user1270710 Points 122

Une façon de vous protéger contre les changements de taille consiste à réserver l'espace maximal (ou supérieur) dont vous aurez besoin:

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

Cela garantira que les push_backs ne provoqueront pas de réallocation des données existantes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X