Wie konvertiere ich a std::vector<double>
in a double array[]
?
Wie konvertiere ich a std::vector<double>
in a double array[]
?
Antworten:
Es gibt einen ziemlich einfachen Trick, da die Spezifikation jetzt garantiert, dass Vektoren ihre Elemente zusammenhängend speichern:
std::vector<double> v;
double* a = &v[0];
double*
, der auf die gleichen Daten verweist. Diese Antwort funktioniert für genau diesen Fall
std::vector<double> v; double* a = v.data();
Wozu? Sie müssen klarstellen: Benötigen Sie einen Zeiger auf das erste Element eines Arrays oder ein Array?
Wenn Sie eine API-Funktion aufrufen, die die erstere erwartet, können Sie Folgendes tun do_something(&v[0], v.size())
: Dabei v
handelt es sich um einen Vektor von double
s. Die Elemente eines Vektors sind zusammenhängend.
Andernfalls müssen Sie nur jedes Element kopieren:
double arr[100];
std::copy(v.begin(), v.end(), arr);
Stellen Sie sicher, dass nicht nur arr
das groß genug ist, sondern dass es arr
voll ist oder dass Sie nicht initialisierte Werte haben.
size()
Funktion zu ändern, die std:vector
Sie verwenden müssen new
oder dies malloc
tun müssen. Wie bereits erwähnt (von Ihnen), double arr[v.size()]
ist dies nicht gültig. Die Verwendung eines Vektors anstelle eines neuen ist eine gute Idee, aber der ganze Punkt der Frage ist, wie Sie einen Vektor in ein Array konvertieren können.
vector<double> thevector;
//...
double *thearray = &thevector[0];
Dies funktioniert garantiert standardmäßig, es gibt jedoch einige Einschränkungen: Achten Sie insbesondere darauf, dass Sie das Gerät nur verwenden, thearray
wenn thevector
es im Umfang ist.
empty()
, da sonst die gefürchtete UB aufgerufen wird.
Vektoren sind effektiv Arrays unter der Haut. Wenn Sie eine Funktion haben:
void f( double a[]);
Sie können es so nennen:
vector <double> v;
v.push_back( 1.23 )
f( &v[0] );
Sie sollten niemals einen Vektor in eine tatsächliche Array-Instanz konvertieren müssen.
f( &v[0] );
für Ihre letzte Zeile
In Bezug auf std::vector<int> vec
, vec zu erhalten int*
, können Sie zwei Methoden:
int * arr = & vec [0];
int * arr = vec.data ();
Wenn Sie irgendeine Art konvertieren möchten T
Vektor T* array
, ersetzen Sie einfach die oben int
auf T
.
Ich werde Ihnen zeigen, warum die beiden oben genannten zum besseren Verständnis funktionieren.
std::vector
ist im Wesentlichen ein dynamisches Array.
Hauptdatenelement wie folgt:
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){}
//......
}
Das range (start_, end_of_storage_)
ist der gesamte Array-Speicher, den der Vektor zuweist;
Das range(start_, finish_)
ist der gesamte Array-Speicher, den der Vektor verwendet;
Das range(finish_, end_of_storage_)
ist der Backup-Array-Speicher.
Zum Beispiel in Bezug auf einen Vektor vec. Das hat {9, 9, 1, 2, 3, 4} Zeiger kann wie folgt.
Also &vec[0]
= start_ (Adresse) (start_ entspricht int * array head)
In c++11
der data()
Member-Funktion geben Sie einfach start_ zurück
pointer data()
{
return start_; //(equivalent to `value_type*`, array head)
}
Wir können dies mit der data () -Methode tun. C ++ 11 bietet diese Methode.
#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;
}
Wenn Sie eine Funktion haben, brauchen Sie wahrscheinlich diese : foo(&array[0], array.size());
. Wenn Sie es geschafft haben, in eine Situation zu geraten, in der Sie ein Array benötigen, müssen Sie eine Umgestaltung vornehmen. Vektoren sind im Grunde genommen erweiterte Arrays. Sie sollten sie immer verwenden.
Sie können so etwas tun
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;
}
}
}