Comment convertir un std::vector<double>
en double array[]
?
Il y a une astuce assez simple à faire, puisque les spécifications maintenant garanties les vecteurs stockent leurs éléments de manière contiguë:
std::vector<double> v;
double* a = &v[0];
Pourquoi? Vous devez préciser: Avez-vous besoin d'un pointeur sur le premier élément d'un tableau ou d'un tableau?
Si vous appelez une fonction API qui attend l'ancienne, vous pouvez faire do_something(&v[0], v.size())
, où v
est un vecteur de double
s. Les éléments d'un vecteur sont contigus.
Sinon, il vous suffit de copier chaque élément:
double arr[100];
std::copy(v.begin(), v.end(), arr);
Assurez-vous que non seulement arr
est assez grand, mais que arr
est rempli ou que vous ayez des valeurs non initialisées.
Pour C++ 11 , vector.data()
fera l'affaire.
vector<double> thevector;
//...
double *thearray = &thevector[0];
Cela est garanti par la norme, mais il y a quelques réserves: veillez à n'utiliser que thearray
alors que thevector
est dans la portée.
Les vecteurs sont efficacement des tableaux sous la peau. Si vous avez une fonction:
void f( double a[]);
vous pouvez l'appeler comme ça:
vector <double> v;
v.Push_back( 1.23 )
f( &v[0] );
Vous ne devriez jamais avoir besoin de convertir un vecteur en une instance de tableau réelle.
En ce qui concerne std::vector<int> vec
, vec pour obtenir int*
, vous pouvez utiliser deux méthodes:
int * arr = & vec [0];
int * arr = vec.data ();
Si vous voulez convertir n'importe quel type T
vector en T* array
, remplacez simplement le susdit int
par T
.
Je vais vous montrer pourquoi les deux précédents fonctionnent pour une bonne compréhension.
std::vector
est essentiellement un tableau dynamique.
Membre principal de données comme ci-dessous:
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){}
//......
}
La range (start_, end_of_storage_)
est toute la mémoire de matrice allouée par le vecteur;
La range(start_, finish_)
est toute la mémoire de matrice utilisée par le vecteur;
range(finish_, end_of_storage_)
est la mémoire de la matrice de sauvegarde.
Par exemple, pour un vecteur vec. qui a {9, 9, 1, 2, 3, 4} est un pointeur comme le ci-dessous.
Donc, &vec[0]
= start_ (adresse.) (Start_ est équivalent à int * array head)
Dans c++11
, la fonction membre data()
vient de renvoyer start_
pointer data()
{
return start_; //(equivalent to `value_type*`, array head)
}
std::vector<double> vec;
double* arr = vec.data();
Nous pouvons le faire en utilisant la méthode data (). C++ 11 fournit cette méthode.
#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;
}
Si vous avez une fonction, vous en avez probablement besoin: foo(&array[0], array.size());
. Si vous avez réussi à vous retrouver dans une situation où vous avez besoin d'un tableau, vous devez alors refactoriser, les vecteurs étant en principe des tableaux étendus, vous devez toujours les utiliser.