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.