So konvertieren Sie Vektor in Array

352

Wie konvertiere ich a std::vector<double>in a double array[]?

Ganuke
quelle
9
Ein bisschen wirft die Frage auf, warum? Sie können als Array auf einen Vektor zugreifen. Was macht ein Array, was ein Vektor nicht macht?
Michael Dorgan
96
@ Michael Der typische Anwendungsfall, den ich habe, ist die Verwendung eines Vektors in meinem eigenen Code und das Aufrufen einer Drittanbieterfunktion, die ein Array benötigt
Michael Mrozek
7
Die herumgeworfene Terminologie ist verwirrend. Ein Zeiger ist kein Array. Wollen wir einen Zeiger auf das erste Element eines Arrays oder ein Array?
GManNickG
7
absolut eine echte Frage - auch eine recht einfache, leicht zu interpretierende. Bitte wieder öffnen.
dbliss
10
"Irgendwie wirft die Frage auf, warum?" - Erstens, Missbrauch dieses Satzes. Zweitens ist es offensichtlich, warum.
Jim Balter

Antworten:

533

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];
Michael Mrozek
quelle
29
@ganuke Du kopierst nicht, du machst einen Zeiger, der auf das tatsächliche Array zeigt, das der Vektor intern verwendet. Wenn Sie GMans Antwort kopieren möchten, erklären Sie, wie
Michael Mrozek
4
@ganuke: Was ist "das Array"? Sie müssen weitere Informationen bereitstellen. Was ist das große Ganze?
GManNickG
6
@ganuke Das tust du nicht, du brauchst nur einen double*, der auf die gleichen Daten verweist. Diese Antwort funktioniert für genau diesen Fall
Michael Mrozek
6
@guneykayim Der Vektor besitzt diesen Speicher, Sie sollten ihn nicht freigeben
Michael Mrozek
23
std::vector<double> v; double* a = v.data();
SinoTrinity
148

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 vhandelt es sich um einen Vektor von doubles. 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 arrdas groß genug ist, sondern dass es arrvoll ist oder dass Sie nicht initialisierte Werte haben.

GManNickG
quelle
15
Hinweis: Verwenden Sie v.size (), um die Anzahl der Elemente für das neue Array abzurufen: double arr [v.size ()];
Rbaleksandar
7
@rbaleksandar: Arrays können keine nicht konstante Ausdrucksgröße haben.
GManNickG
@ GManNickG: Es funktioniert, aber ich denke, hier gibt es einige Missverständnisse. Stellen Sie sich Folgendes vor: Sie haben eine Klasse mit einer Reihe von Zeigern verschiedener Typen, die auf Arrays verweisen müssen, die zum Zeitpunkt der Definition Ihrer Klasse nicht bekannt sind und die später durch Leeren verschiedener Vektoren und Verwenden ihres Größenparameters erstellt werden um zu bestimmen, wie viel Platz verwendet werden soll. Ein weiteres Beispiel: eine einfache Funktion void arrayTest (unsigned int arrSize), die ein Array (short arr [arrSize];) darin erstellt, indem sie ihren Funktionsparameter für die Größe verwendet.
Rbaleksandar
1
@rbaleksandar Kein Missverständnis; In C ++ 11 und früheren Versionen müssen Arraygrößen integrale konstante Ausdrücke sein. Ihr Funktionsbeispiel wird häufig für VLAs in C verwendet, jedoch nur von der (nicht standardmäßigen) Erweiterung in C ++ unterstützt. Es kann jedoch zu C ++ 14 kommen: stackoverflow.com/a/17318040/87234 . Aber ab sofort ist es einfach keine Standardoption.
GManNickG
1
@GManNickG Ich denke, @Jet sagt, wenn Sie einen Vektor in ein Array konvertieren möchten und Sie beabsichtigen, die Größe des Arrays mithilfe der size()Funktion zu ändern, die std:vectorSie verwenden müssen newoder dies malloctun 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.
RyanP
17
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, thearraywenn thevectores im Umfang ist.

user168715
quelle
4
... und stellen Sie sicher, dass der Vektor nicht vorhanden ist empty(), da sonst die gefürchtete UB aufgerufen wird.
sbi
13

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.


quelle
1
Ich denke, Sie meinten f( &v[0] );für Ihre letzte Zeile
Michael Mrozek
10

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

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

  2. int * arr = vec.data ();

Wenn Sie irgendeine Art konvertieren möchten TVektor T* array, ersetzen Sie einfach die oben intauf 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.

Geben Sie hier die Bildbeschreibung ein

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)
}
Jayhello
quelle
2

Wir können dies mit der data () -Methode tun. C ++ 11 bietet diese Methode.

Code-Auszug

#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;
}
Hautausschläge
quelle
2
std::vector<double> vec;
double* arr = vec.data();
Toby
quelle
1

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.


quelle
-1

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;
        }
    }
}
Sakthi Vignesh
quelle
v [i] [j]; für 2d Array
Sakthi Vignesh