vectors c++ arrays vector

vectors - vector of vector c++



Cómo convertir vector a matriz (10)

¿Cómo convierto un std::vector<double> a una double array[] ?


¿Para qué? Necesita aclarar: ¿Necesita un puntero al primer elemento de una matriz, o una matriz?

Si está llamando a una función API que espera lo primero, puede hacer do_something(&v[0], v.size()) , donde v es un vector de double s. Los elementos de un vector son contiguos.

De lo contrario, solo tienes que copiar cada elemento:

double arr[100]; std::copy(v.begin(), v.end(), arr);

Asegúrese de que no solo sea lo suficientemente grande, sino que se llene o tenga valores sin inicializar.


En cuanto a std::vector<int> vec , vec to get int* , puede usar dos métodos:

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

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

Si desea convertir cualquier vector de tipo T a T* array , simplemente reemplace el int anterior a T

Les mostraré por qué funcionan los dos anteriores, para una buena comprensión.

std::vector es una matriz dinámica esencialmente.

Miembro de datos principal como abajo:

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){} //...... }

El range (start_, end_of_storage_) es toda la memoria de matriz que el vector asigna;

El range(start_, finish_) es toda la memoria de matriz del vector utilizado;

El range(finish_, end_of_storage_) es la memoria de matriz de respaldo.

Por ejemplo, en cuanto a un vector vec. que tiene {9, 9, 1, 2, 3, 4} es el puntero puede gustar a la siguiente.

Entonces &vec[0] = start_ (address.) (Start_ es equivalente a int * array head)

En c++11 la función miembro data() simplemente devuelve start_

pointer data() { return start_; //(equivalent to `value_type*`, array head) }


Hay un truco bastante simple para hacerlo, ya que la especificación ahora guarantees vectores almacenan sus elementos de forma contigua:

std::vector<double> v; double* a = &v[0];


Los vectores son efectivamente matrices debajo de la piel. Si tienes una función:

void f( double a[]);

Puedes llamarlo así:

vector <double> v; v.push_back( 1.23 ) f( &v[0] );

Nunca debería necesitar convertir un vector en una instancia de matriz real.



Podemos hacer esto usando el método data (). C ++ 11 proporciona este método.

Fragmento de código

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


Puedes hacer algo como esto.

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


Si tiene una función, entonces probablemente necesite esto: foo(&array[0], array.size()); . Si logró entrar en una situación en la que necesita una matriz, entonces necesita refactorizar, los vectores son básicamente matrices extendidas, siempre debe usarlas.


std::vector<double> vec; double* arr = vec.data();


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

Esto está garantizado para que funcione según la norma, sin embargo, existen algunas advertencias: en particular, tenga cuidado de usar solo el thearray mientras el thevector esté dentro del alcance.