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

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

Est-ce que std :: vector fournit un access au tableau C sous-jacent? Je cherche quelque chose comme ça

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

MODIFIER:

En outre, est-il possible de faire l’inverse, à savoir comment initialiser un std::vector partir d’un tableau C sans copier?

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

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

 int* pv = &v[0]; 

Ce pointeur n’est valide que tant que le vecteur n’est pas réalloué. La réallocation se produit automatiquement si vous insérez plus d’éléments que la capacité restante du vecteur (c’est-à-dire si v.size() + NumberOfNewElements > v.capacity() . Vous pouvez utiliser v.reserve(NewCapacity) pour vous assurer que le vecteur a un capacité d’au moins NewCapacity .

Rappelez-vous également que lorsque le vecteur est détruit, le tableau sous-jacent est également supprimé.

 int* pv = &v[0] 

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

Scott Meyers couvre largement ce sujet dans ses livres.

Dans c ++ 11, vous pouvez utiliser vector :: data () pour obtenir le pointeur C array.

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

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

Soyez averti que cela ne fonctionnera que tant que le vecteur n’aura pas à croître et que le vecteur continuera à gérer la durée de vie du tableau sous-jacent (c’est-à-dire, ne pas supprimer pv). Ce n’est pas une chose rare à faire lors de l’appel des API C sous-jacentes, mais cela se fait généralement avec un temporaire non nommé plutôt qu’en créant une variable explicite int *.

Une façon de vous protéger contre les changements de taille est de réserver l’espace maximal (ou plus grand) dont vous aurez besoin:

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

Cela garantira que push_backs ne provoquera pas la réallocation des données existantes.