Come ottenere std :: puntatore vettoriale ai dati grezzi?

Sto cercando di usare std::vector come array di char .

La mia funzione contiene un puntatore vuoto:

 void process_data(const void *data); 

Prima ho semplicemente usato questo codice:

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

Che ha funzionato come previsto.

Ma ora ho bisogno della dynamic di std::vector , quindi ho provato questo codice:

 vector something; *cut* process_data(something); 

La domanda è: come faccio a passare il vettore char alla mia funzione in modo da poter accedere ai dati grezzi vettoriali (indipendentemente dal formato in cui sono: float, ecc.)?

Ho provato questo:

 process_data(&something); 

E questo:

 process_data(&something.begin()); 

Ma ha restituito un puntatore a dati senza senso e quest’ultimo ha dato un avvertimento: warning C4238: nonstandard extension used : class rvalue used as lvalue .

&something ti dà l’indirizzo dell’object std::vector , non l’indirizzo dei dati che contiene. &something.begin() fornisce l’indirizzo dell’iteratore restituito da begin() (come avverte il compilatore, questo non è tecnicamente consentito perché something.begin() è un’espressione rvalue, quindi il suo indirizzo non può essere preso).

Supponendo che il contenitore contenga almeno un elemento, è necessario ottenere l’indirizzo dell’elemento iniziale del contenitore, che è ansible ottenere tramite

  • &something[0] o &something.front() (l’indirizzo dell’elemento all’indice 0), o

  • &*something.begin() (l’indirizzo dell’elemento a cui punta l’iteratore restituito da begin() ).

In C ++ 11, una nuova funzione membro è stata aggiunta a std::vector : data() . Questa funzione membro restituisce l’indirizzo dell’elemento iniziale nel contenitore, proprio come &something.front() . Il vantaggio di questa funzione membro è che va bene chiamarlo anche se il contenitore è vuoto.

something.data() restituirà un puntatore allo spazio dati del vettore.

Prendi invece un puntatore al primo elemento:

 process_data (&something [0]);