caracteres - Conversión entre C++ std:: vector y C array sin copiar
string to char array c++ (5)
Me gustaría poder convertir entre std :: vector y su subyacente C array int * sin copiar explícitamente los datos.
¿Std :: vector proporciona acceso a la matriz C subyacente? Estoy buscando algo como esto
vector<int> v (4,100)
int* pv = v.c_array();
EDITAR:
Además, ¿es posible hacer lo contrario, es decir, cómo inicializaría un std::vector
de una matriz C sin copiar?
int pv[4] = { 4, 4, 4, 4};
vector<int> v (pv);
En c ++ 11, puede usar vector::data() para obtener el puntero C array.
Puede obtener un puntero al primer elemento de la siguiente manera:
int* pv = &v[0];
Este puntero solo es válido siempre que el vector no se reasigne. La reasignación ocurre automáticamente si inserta más elementos de los que caben en la capacidad restante del vector (es decir, si v.size() + NumberOfNewElements > v.capacity()
. Puede usar v.reserve(NewCapacity)
para asegurarse de que el vector tiene una capacidad de al menos NewCapacity
.
También recuerde que cuando el vector se destruye, la matriz subyacente también se elimina.
Si tiene condiciones muy controladas, puede hacer:
std::vector<int> v(4,100);
int* pv = &v[0];
Tenga en cuenta que esto solo funcionará siempre que el vector no tenga que crecer, y el vector administrará la vida útil de la matriz subyacente (es decir, no eliminará pv). Esto no es algo raro de hacer cuando se llama a C API subyacentes, pero generalmente se hace con un temporal sin nombre en lugar de crear una variable int * explícita.
Una forma de protegerse contra los cambios de tamaño es reservar el espacio máximo (o más grande) que necesitará:
std::vector<int> v(4,100); //Maybe need
v.reserve(40); //reallocate to block out space for 40 elements
Esto asegurará que push_backs no causará la reasignación de los datos existentes.
int* pv = &v[0]
Tenga en cuenta que este es solo el caso de std::vector<>
, no puede hacer lo mismo con otros contenedores estándar.
Scott Meyers cubre este tema extensamente en sus libros.