¿Cómo convierto std::vector<double>
a a double array[]
?
¿Cómo convierto std::vector<double>
a a double array[]
?
Respuestas:
Hay un truco bastante simple para hacerlo, ya que la especificación ahora garantiza que los vectores almacenen sus elementos de forma contigua:
std::vector<double> v;
double* a = &v[0];
double*
que apunte a los mismos datos. Esta respuesta funciona exactamente para ese caso
std::vector<double> v; double* a = v.data();
¿Para qué? Necesita aclarar: ¿Necesita un puntero al primer elemento de una matriz o una matriz?
Si está llamando a una función API que espera lo primero, puede hacerlo do_something(&v[0], v.size())
, donde v
es un vector de double
s. Los elementos de un vector son contiguos.
De lo contrario, solo tiene que copiar cada elemento:
double arr[100];
std::copy(v.begin(), v.end(), arr);
Asegúrese de que no solo arr
sea lo suficientemente grande, sino que arr
se llene, o de que tenga valores no inicializados.
size()
función de la std:vector
que necesitará usar new
o malloc
para hacer eso. Como ya se señaló (por usted) eso double arr[v.size()]
no es válido. Usar un vector en lugar de nuevo es una buena idea, pero el punto principal de la pregunta es cómo puede convertir un vector en una matriz.
vector<double> thevector;
//...
double *thearray = &thevector[0];
Se garantiza que esto funcione de manera estándar, sin embargo, existen algunas advertencias: en particular, tenga cuidado de usar solo thearray
mientras thevector
esté dentro del alcance.
empty()
, de lo contrario, esto invocaría al temido UB.
Los vectores efectivamente son matrices debajo de la piel. Si tienes una función:
void f( double a[]);
puedes llamarlo así:
vector <double> v;
v.push_back( 1.23 )
f( &v[0] );
Nunca debería necesitar convertir un vector en una instancia de matriz real.
f( &v[0] );
a tu última línea
En cuanto a std::vector<int> vec
vec para obtener int*
, puede usar dos métodos:
int * arr = & vec [0];
int * arr = vec.data ();
Si desea convertir cualquier tipo de T
vector a T* array
, simplemente reemplace el anterior int
a T
.
Te mostraré por qué los dos anteriores funcionan, para una buena comprensión.
std::vector
Es una matriz dinámica esencialmente.
Miembro de datos principal de la siguiente manera:
template <class T, class Alloc = allocator<T>>
class vector{
public:
typedef T value_type;
typedef T* iterator;
typedef T* pointer;
//.......
private:
pointer start_;
pointer finish_;
pointer end_of_storage_;
public:
vector():start_(0), finish_(0), end_of_storage_(0){}
//......
}
El range (start_, end_of_storage_)
es toda la memoria de matriz que asigna el vector;
El range(start_, finish_)
es toda la memoria de matriz que utiliza el vector;
El range(finish_, end_of_storage_)
es la memoria de la matriz de respaldo.
Por ejemplo, en cuanto a un vector vec. que tiene {9, 9, 1, 2, 3, 4} es un puntero como el siguiente.
So &vec[0]
= start_ (address.) (Start_ es equivalente a int * array head)
En c++11
la data()
función miembro simplemente devuelve start_
pointer data()
{
return start_; //(equivalent to `value_type*`, array head)
}
Podemos hacer esto usando el método data (). C ++ 11 proporciona este método.
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
vector<int>v = {7, 8, 9, 10, 11};
int *arr = v.data();
for(int i=0; i<v.size(); i++)
{
cout<<arr[i]<<" ";
}
return 0;
}
Si usted tiene una función, entonces es probable que tenga la siguiente: foo(&array[0], array.size());
. Si logró entrar en una situación en la que necesita una matriz, entonces necesita refactorizar, los vectores son básicamente matrices extendidas, siempre debe usarlas.
Puedes hacer algo como esto
vector <int> id;
vector <double> v;
if(id.size() > 0)
{
for(int i = 0; i < id.size(); i++)
{
for(int j = 0; j < id.size(); j++)
{
double x = v[i][j];
cout << x << endl;
}
}
}