C++ 11 proporciona el método data()
en std::vector
que devuelve un T*
. Esto le permite hacer:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vector = {1,2,3,4,5};
int* array = vector.data();
std::cout << array[4] << std::endl; //Prints '5'
}
Sin embargo, hacer esto (o cualquiera de los métodos mencionados anteriormente) puede ser peligroso ya que el puntero podría ser válida si se cambia el tamaño del vector. Esto se puede mostrar con:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vector = {1,2,3,4,5};
int* array = vector.data();
vector.resize(100); //This will reserve more memory and move the internal array
//This _may_ end up taking the place of the old array
std::vector<int> other = {6,7,8,9,10};
std::cout << array[4] << std::endl; //_May_ now print '10'
}
Esto podría bloquear o hacer casi cualquier cosa, así que ten cuidado al usar esto.
En C++ 11 la forma correcta es 'theVector.data()'. – ildjarn
Tenga en cuenta que '& theVector [0]' no genera una * matriz *, sino un * puntero *. Los punteros y matrices son cosas diferentes en el idioma, con diferentes tipos. No puede * convertir * un vector en una matriz de ninguna manera estándar, aunque su enfoque es una forma estándar de obtener un * puntero * a los datos. –
No llamaría esto un hackish ya que la compatibilidad con las API de C que usan punteros de matriz fue una decisión de diseño en el STL. La alternativa, que a veces se ve & * theVector.begin(), no debe utilizarse. – aselle