C++ Usando std :: vector como una matriz C


Ejemplo

Hay varias formas de usar un std::vector como una matriz de C (por ejemplo, para la compatibilidad con las bibliotecas de C). Esto es posible porque los elementos en un vector se almacenan de forma contigua.

C ++ 11
std::vector<int> v{ 1, 2, 3 };
int* p = v.data();

A diferencia de las soluciones basadas en estándares de C ++ anteriores (ver más abajo), la función miembro .data() también puede aplicarse a vectores vacíos, porque en este caso no causa un comportamiento indefinido.

Antes de C ++ 11, tomaría la dirección del primer elemento del vector para obtener un puntero equivalente, si el vector no está vacío, estos dos métodos son intercambiables:

int* p = &v[0];      // combine subscript operator and 0 literal

int* p = &v.front(); // explicitly reference the first element

Nota: Si el vector está vacío, v[0] y v.front() no están definidos y no se pueden usar.

Al almacenar la dirección base de los datos del vector, tenga en cuenta que muchas operaciones (como push_back , resize , etc.) pueden cambiar la ubicación de la memoria de datos del vector, lo que invalida los punteros de datos anteriores . Por ejemplo:

std::vector<int> v;
int* p = v.data();
v.resize(42);      // internal memory location changed; value of p is now invalid