new - vector insert c++
Cómo obtener std:: vector pointer a los datos sin procesar? (3)
Estoy tratando de usar std::vector
como una matriz de caracteres.
Mi función tiene un puntero de vacío:
void process_data(const void *data);
Antes de simplemente usar este código:
char something[] = "my data here";
process_data(something);
Lo cual funcionó como se esperaba.
Pero ahora necesito la dinámica de std::vector
, así que probé este código:
vector<char> something;
*cut*
process_data(something);
La pregunta es, ¿cómo paso el vector char a mi función para que pueda acceder a los datos brutos vectoriales (sin importar qué formato sea, flotantes, etc.)?
Intenté esto:
process_data(&something);
Y esto:
process_data(&something.begin());
Pero devolvió un puntero a datos incoherentes, y este último dio una advertencia: warning C4238: nonstandard extension used : class rvalue used as lvalue
.
Tome un puntero al primer elemento en su lugar:
process_data (&something [0]);
&something
le da la dirección del objeto std::vector
, no la dirección de los datos que contiene. &something.begin()
le proporciona la dirección del iterador devuelto por begin()
(como advierte el compilador, técnicamente esto no está permitido porque something.begin()
es una expresión rvalue, por lo que no se puede tomar su dirección).
Suponiendo que el contenedor tiene al menos un elemento, debe obtener la dirección del elemento inicial del contenedor, que puede obtener a través de
&something[0]
or&something.front()
(la dirección del elemento en el índice 0), o&*something.begin()
(la dirección del elemento al que apunta el iterador devuelto porbegin()
).
En C ++ 11, se agregó una nueva función miembro a std::vector
: data()
. Esta función miembro devuelve la dirección del elemento inicial en el contenedor, al igual que &something.front()
. La ventaja de esta función de miembro es que está bien llamarlo incluso si el contenedor está vacío.
something.data()
devolverá un puntero al espacio de datos del vector.