Come faccio a convertire a std::vector<double>
in a double array[]
?
Come faccio a convertire a std::vector<double>
in a double array[]
?
Risposte:
C'è un trucco abbastanza semplice per farlo, poiché le specifiche ora garantiscono che i vettori memorizzino i loro elementi in modo contiguo:
std::vector<double> v;
double* a = &v[0];
double*
che punti agli stessi dati. Questa risposta funziona esattamente per quel caso
std::vector<double> v; double* a = v.data();
Per che cosa? È necessario chiarire: è necessario un puntatore al primo elemento di un array o un array?
Se stai chiamando una funzione API che prevede la prima, puoi fare do_something(&v[0], v.size())
, dove v
è un vettore di double
s. Gli elementi di un vettore sono contigui.
Altrimenti, devi solo copiare ogni elemento:
double arr[100];
std::copy(v.begin(), v.end(), arr);
Assicurati che non solo thar arr
sia abbastanza grande, ma che arr
si riempia o che tu abbia valori non inizializzati.
size()
funzione del, std:vector
è necessario utilizzare new
o malloc
per farlo. Come è stato già sottolineato (da te) ciò double arr[v.size()]
non è valido. L'uso del vettore al posto del nuovo è una buona idea, ma l'intero punto della domanda è come è possibile convertire un vettore in un array.
vector<double> thevector;
//...
double *thearray = &thevector[0];
Questo è garantito per funzionare dallo standard, tuttavia ci sono alcuni avvertimenti: in particolare, fare attenzione a usare solo thearray
mentre thevector
è nell'ambito.
empty()
, altrimenti ciò invocherebbe il temuto UB.
I vettori sono in effetti matrici sotto la pelle. Se hai una funzione:
void f( double a[]);
puoi chiamarlo così:
vector <double> v;
v.push_back( 1.23 )
f( &v[0] );
Non dovresti mai aver bisogno di convertire un vettore in un'istanza di array reale.
f( &v[0] );
per la vostra ultima linea
Per quanto riguarda std::vector<int> vec
, vec per ottenere int*
, è possibile utilizzare due metodi:
int * arr = & vec [0];
int * arr = vec.data ();
Se si desidera convertire qualsiasi tipo T
di vettore a T* array
, basta sostituire il sopra int
a T
.
Ti mostrerò perché le due precedenti funzionano, per una buona comprensione?
std::vector
è essenzialmente un array dinamico.
Membro dei dati principali come di seguito:
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){}
//......
}
L' range (start_, end_of_storage_)
vale a memoria di matrice vettore allocare;
L' range(start_, finish_)
vale a memoria di matrice vettore utilizzato;
La range(finish_, end_of_storage_)
è la memoria di matrice di backup.
Ad esempio, per quanto riguarda un vettore vec. che ha {9, 9, 1, 2, 3, 4} è che il puntatore potrebbe gradire quanto segue.
Quindi &vec[0]
= start_ (indirizzo.) (Start_ è equivalente a int * array head)
c++11
Nella data()
funzione membro solo ritorno start_
pointer data()
{
return start_; //(equivalent to `value_type*`, array head)
}
Possiamo farlo usando il metodo data (). C ++ 11 fornisce questo metodo.
#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;
}
Se si dispone di una funzione, allora probabilmente bisogno di questo: foo(&array[0], array.size());
. Se sei riuscito a entrare in una situazione in cui hai bisogno di un array, allora devi refactoring, i vettori sono sostanzialmente array estesi, dovresti sempre usarli.
Puoi fare qualcosa del genere
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;
}
}
}