149 votes

Comment obtenir std::vector de pointeur vers les données brutes?

Im essayant d'utiliser les std::vector comme un tableau de char.

Ma fonction prend un pointeur void:

void process_data(const void *data);

Avant j'ai tout simplement utilisé 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, j'utilise donc ce code à la place:

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

La question est, comment puis-je passer le char vecteur pour ma fonction donc je ne peux accéder au vecteur de données brutes (n'importe quel format il est, de flotteurs ou etc).

J'ai essayé ceci:

process_data(&something);

Et ceci:

process_data(&something.begin());

Mais elle est revenue un pointeur vers le charabia de données, et ce dernier a donné avertissement: warning C4238: nonstandard extension used : class rvalue used as lvalue

227voto

James McNellis Points 193607

&something vous donne l'adresse de l' std::vector objet, non pas à l'adresse des données qu'elle détient. &something.begin() vous donne l'adresse de l'itérateur renvoyé par begin() (comme le compilateur met en garde, ce n'est pas techniquement autorisée, car something.begin() est une rvalue expression, de sorte que son adresse ne peut pas être pris).

En supposant que le conteneur a au moins un élément, vous devez obtenir l'adresse du premier élément du conteneur, 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 de membre a été ajouté à l' std::vector: data(). Cette fonction retourne l'adresse du premier élément dans le conteneur, comme &something.front(). L'avantage de cette fonction membre est qu'il est correct de l'appeler, même si le conteneur est vide.

74voto

Chris Dodd Points 39013

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

12voto

Steven Don Points 1510

Prendre un pointeur vers le premier élément à la place:

process_data (&something [0]);

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