cppreference a cette note pour std::vector::data
:
Retourne le pointeur vers le sous-jacent de la matrice de servir comme élément de stockage. Le pointeur est tel que la gamme
[data(); data() + size())
est toujours une plage valide, même si le récipient est vide.
Que signifie "plage valide" signifie ici exactement? Ce sera data()
de rendement si le vecteur est de longueur nulle?
Plus précisément, pour un zéro-longueur du vecteur:
- Peut -
data()
jamais être un pointeur null? - Il peut être en toute sécurité déréférencé? (Même si c'points de junk.)
- Est-il garanti d'être différente entre les deux (de longueur nulle) les vecteurs?
Je travaille avec une bibliothèque C qui prend des tableaux et ne permettra pas un pointeur null, même pour un zéro-longueur du tableau. Cependant, il ne fait pas de déréférencement de la matrice de stockage pointeur si la longueur du tableau est égale à zéro, il vérifie juste si il est NULL
. Je veux m'assurer que je peux passer data()
de cette bibliothèque C, de sorte que la seule question pertinente est celle de (1) ci-dessus. (2) et (3) sont juste de la curiosité dans le cas où une situation similaire se présente.
Mise à jour
Sur la base des observations qui n'ont pas été tourné dans les réponses, on peut essayer le programme suivant:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v;
cout << v.data() << endl;
v.push_back(1);
cout << v.data() << endl;
v.pop_back();
cout << v.data() << endl;
v.shrink_to_fit();
cout << v.data() << endl;
return 0;
}
Avec mon compilateur de sortie:
0x0
0x7f896b403300
0x7f896b403300
0x0
Ceci montre que:
data()
peut en effet être un pointeur null, donc les réponses sont (1) oui (2) non (3) nonmais il n'est pas toujours un pointeur null pour un zéro-taille du vecteur
Oui, évidemment, j'aurais essayé avant de demander.