¿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 ves un vector de doubles. 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 arrsea lo suficientemente grande, sino que arrse llene, o de que tenga valores no inicializados.
size()función de la std:vectorque necesitará usar newo mallocpara 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 thearraymientras thevectoresté 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> vecvec para obtener int*, puede usar dos métodos:
int * arr = & vec [0];
int * arr = vec.data ();
Si desea convertir cualquier tipo de Tvector a T* array, simplemente reemplace el anterior inta 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;
}
}
}