web-dev-qa-db-fra.com

Comment obtenir le pointeur std :: vector sur les données brutes?

J'essaie d'utiliser std::vector comme un tableau char.

Ma fonction prend un pointeur vide:

void process_data(const void *data);

Avant je viens simplement d'utiliser ce code:

char something[] = "my data here";
process_data(something);

Ce qui a fonctionné comme prévu.

Mais maintenant, j'ai besoin de la dynamicité de std::vector, alors j'ai essayé ce code à la place:

vector<char> something;
*cut*
process_data(something);

La question qui se pose est de savoir comment passer le vecteur char à ma fonction pour pouvoir accéder aux données brutes de vecteur (quel que soit leur format - flottants, etc.)?

J'ai essayé ceci:

process_data(&something);

Et ça:

process_data(&something.begin());

Mais il a renvoyé un pointeur vers le charabia et ce dernier a averti: warning C4238: nonstandard extension used : class rvalue used as lvalue.

146
Rookie

&something vous donne l'adresse de l'objet std::vector, pas l'adresse des données qu'il contient. &something.begin() vous donne l'adresse de l'itérateur renvoyé par begin() (comme le prévient le compilateur, cela n'est techniquement pas autorisé car something.begin() est une expression rvalue, son adresse ne peut donc pas être prise).

En supposant que le conteneur contienne au moins un élément, vous devez obtenir l'adresse de l'élément initial du conteneur, que vous pouvez obtenir via

  • &something[0] ou &something.front() (l'adresse de l'élément à l'indice 0), ou

  • &*something.begin() (l'adresse de l'élément pointé par l'itérateur renvoyé par begin()).

En C++ 11, une nouvelle fonction membre a été ajoutée à std::vector: data(). Cette fonction membre renvoie l'adresse de l'élément initial dans le conteneur, tout comme &something.front(). L'avantage de cette fonction membre est que vous pouvez l'appeler même si le conteneur est vide.

223
James McNellis

something.data() renverra un pointeur sur l'espace de données du vecteur.

72
Chris Dodd

Prenez un pointeur sur le premier élément à la place:

process_data (&something [0]);
12
Steven Don