468 Stimmen

Vektor in Array umwandeln

Wie konvertiere ich eine std::vector<double> zu einer double array[] ?

676voto

Michael Mrozek Punkte 160867

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];

205voto

GManNickG Punkte 476445

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.

170voto

gzbwb Punkte 1481

Für C++11 , vector.data() reicht aus.

23voto

user168715 Punkte 5331
vector<double> thevector;
//...
double *thearray = &thevector[0];

Der Standard garantiert, dass dies funktioniert, allerdings gibt es einige Vorbehalte: Achten Sie insbesondere darauf, dass Sie nur thearray während thevector in den Geltungsbereich fällt.

23voto

Jayhello Punkte 4867

In Bezug auf std::vector<int> vec , vec zu erhalten int* können Sie zwei Methoden anwenden:

  1. int* arr = &vec[0];

  2. 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.

enter image description here

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)
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X