web-dev-qa-db-fra.com

Comment convertir un vecteur en tableau

Comment convertir un std::vector<double> en double array[]?

312
ganuke

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];
489
Michael Mrozek

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

136
GManNickG

Pour C++ 11 , vector.data() fera l'affaire.

77
gzbwb
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.

16
user168715

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.

13
anon

En ce qui concerne std::vector<int> vec, vec pour obtenir int*, vous pouvez utiliser deux méthodes:

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

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

enter image description here

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)
}
5
Jayhello
std::vector<double> vec;
double* arr = vec.data();
2
Toby

Nous pouvons le faire en utilisant la méthode data (). C++ 11 fournit cette méthode.

Extrait de code

#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;
}
2
rashedcs

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.

1
user6244076