Hoe converteer ik een std::vector<double>
naar een double array[]
?
Antwoord 1, autoriteit 100%
Er is een vrij eenvoudige truc om dit te doen, aangezien de spec nu garantiesvectoren slaan hun elementen aaneengesloten op:
std::vector<double> v;
double* a = &v[0];
Antwoord 2, autoriteit 28%
Waarvoor? Je moet verduidelijken: heb je een pointer nodig naar het eerste element van een array, of een array?
Als je een API-functie aanroept die de eerste verwacht, kun je do_something(&v[0], v.size())
doen, waarbij v
is een vector van double
en. De elementen van een vector zijn aaneengesloten.
Anders hoeft u alleen elk element te kopiëren:
double arr[100];
std::copy(v.begin(), v.end(), arr);
Zorg ervoor dat niet alleen de arr
groot genoeg is, maar dat arr
ook vol raakt, of dat je niet-geïnitialiseerde waarden hebt.
Antwoord 3, autoriteit 22%
Voor C++11, vector.data()
zal het lukken.
Antwoord 4, autoriteit 4%
vector<double> thevector;
//...
double *thearray = &thevector[0];
Dit werkt gegarandeerd volgens de standaard, maar er zijn enkele kanttekeningen: zorg er in het bijzonder voor dat u alleen thearray
gebruikt terwijl thevector
binnen het bereik is.
Antwoord 5, autoriteit 3%
Vectoren zijn in feite arrays onder de huid. Als je een functie hebt:
void f( double a[]);
je kunt het zo noemen:
vector <double> v;
v.push_back( 1.23 )
f( &v[0] );
Het zou nooit nodig moeten zijn om een vector om te zetten in een echte array-instantie.
Antwoord 6, autoriteit 2%
Wat betreft std::vector<int> vec
, vec om int*
te krijgen, je kunt twee methoden gebruiken:
-
int* arr = &vec[0];
-
int* arr = vec.data();
Als u een type T
vector wilt converteren naar T* array
, vervangt u gewoon de bovenstaande int
naar T
.
Ik zal je laten zien waarom de bovenstaande twee werken, voor een goed begrip?
std::vector
is in wezen een dynamische array.
Hoofdgegevenslid zoals hieronder:
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){}
//......
}
Het range (start_, end_of_storage_)
is al het arraygeheugen dat de vector toewijst;
Het range(start_, finish_)
is al het arraygeheugen dat de vector heeft gebruikt;
Het range(finish_, end_of_storage_)
is het back-uparraygeheugen.
Bijvoorbeeld voor een vector vec. die {9, 9, 1, 2, 3, 4} heeft, kan de onderstaande aanwijzer leuk vinden.
Dus &vec[0]
= start_ (adres.) (start_ is gelijk aan int* arraykop)
In c++11
retourneert de data()
lidfunctie gewoon start_
pointer data()
{
return start_; //(equivalent to `value_type*`, array head)
}
Antwoord 7
We kunnen dit doen met de data()-methode. C++11 biedt deze methode.
Codefragment
#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;
}
Antwoord 8
std::vector<double> vec;
double* arr = vec.data();
Antwoord 9
Als je een functie hebt, heb je waarschijnlijk deze nodig:foo(&array[0], array.size());
. Als het je is gelukt om in een situatie te komen waarin je een array nodig hebt, moet je refactoren, vectoren zijn in feite uitgebreide arrays, je moet ze altijd gebruiken.
Antwoord 10
Je kunt zoiets doen
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;
}
}
}