Wie konvertiere ich eine std::vector<double>
zu einer double array[]
?
Antworten
Zu viele Anzeigen?Es gibt einen recht einfachen Trick, um dies zu tun, da die Spezifikation nun garantiert Vektoren speichern ihre Elemente zusammenhängend:
std::vector<double> v;
double* a = &v[0];
Und wozu? Das müssen Sie klären: Benötigen Sie einen Zeiger auf das erste Element eines Arrays oder auf ein Array?
Wenn Sie eine API-Funktion aufrufen, die Ersteres erwartet, können Sie Folgendes tun do_something(&v[0], v.size())
donde v
ist ein Vektor von double
s. Die Elemente eines Vektors sind zusammenhängend.
Andernfalls müssen Sie einfach jedes Element kopieren:
double arr[100];
std::copy(v.begin(), v.end(), arr);
Stellen Sie nicht nur sicher, dass arr
groß genug ist, sondern dass arr
aufgefüllt wird, oder Sie haben nicht initialisierte Werte.
Für C++11 , vector.data()
reicht aus.
In Bezug auf std::vector<int> vec
, vec zu erhalten int*
können Sie zwei Methoden anwenden:
-
int* arr = &vec[0];
-
int* arr = vec.data();
Wenn Sie einen beliebigen Typ konvertieren wollen T
Vektor nach T* array
ersetzen Sie einfach die obige int
a T
.
Ich werde Ihnen zeigen, warum die beiden oben genannten Arbeiten, für ein gutes Verständnis?
std::vector
ist im Wesentlichen ein dynamisches Array.
Hauptdatenelement wie unten:
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){}
//......
}
En range (start_, end_of_storage_)
ist der gesamte Array-Speicher, den der Vektor zugewiesen hat;
En range(start_, finish_)
ist der gesamte vom Vektor verwendete Array-Speicher;
En range(finish_, end_of_storage_)
ist der Backup-Array-Speicher.
Zum Beispiel, wie zu einem Vektor vec. die {9, 9, 1, 2, 3, 4} ist Zeiger kann wie die unten.
Also &vec[0]
= start_ (Adresse) (start_ ist gleichbedeutend mit int* array head)
En c++11
el data()
member function just return start_
pointer data()
{
return start_; //(equivalent to `value_type*`, array head)
}
- See previous answers
- Weitere Antworten anzeigen