Como faço para converter um std::vector<double>
para um double array[]
?
Como faço para converter um std::vector<double>
para um double array[]
?
Respostas:
Existe um truque bastante simples para fazer isso, já que a especificação agora garante que os vetores armazenem seus elementos de forma contígua:
std::vector<double> v;
double* a = &v[0];
double*
que aponte para os mesmos dados. Esta resposta funciona exatamente nesse caso
std::vector<double> v; double* a = v.data();
Pelo que? Você precisa esclarecer: Você precisa de um ponteiro para o primeiro elemento de uma matriz ou uma matriz?
Se você está chamando uma função de API que espera a anterior, pode fazê-lo do_something(&v[0], v.size())
, onde v
é um vetor de double
s. Os elementos de um vetor são contíguos.
Caso contrário, você apenas precisará copiar cada elemento:
double arr[100];
std::copy(v.begin(), v.end(), arr);
Certifique-se de que não seja apenas arr
grande o suficiente, mas que arr
seja preenchido ou que você tenha valores não inicializados.
size()
função do std:vector
que precisará usar new
ou malloc
fazer isso. Como já foi indicado (por você) que double arr[v.size()]
não é válido. Usar vetor no lugar de novo é uma boa idéia, mas o ponto principal da questão é como você pode converter um vetor em uma matriz.
vector<double> thevector;
//...
double *thearray = &thevector[0];
É garantido que ele funcione de acordo com o padrão, no entanto, existem algumas ressalvas: em particular, tome cuidado para usar apenas thearray
enquanto thevector
estiver no escopo.
empty()
, caso contrário, isso invocaria o temido UB.
Os vetores são efetivamente matrizes sob a pele. Se você tem uma função:
void f( double a[]);
você pode chamar assim:
vector <double> v;
v.push_back( 1.23 )
f( &v[0] );
Você nunca precisa converter um vetor em uma instância de matriz real.
f( &v[0] );
para sua última linha
Quanto ao std::vector<int> vec
vec para obter int*
, você pode usar dois métodos:
int * arr = & vec [0];
int * arr = vec.data ();
Se você deseja converter qualquer tipo de T
vetor para T* array
, basta substituir o acima int
por T
.
Eu vou lhe mostrar por que as duas obras acima, para um bom entendimento?
std::vector
é uma matriz dinâmica essencialmente.
Membro de dados principal como abaixo:
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){}
//......
}
O range (start_, end_of_storage_)
é toda a memória conjunto o vetor alocar;
A range(start_, finish_)
é toda a memória da matriz que o vetor usou;
A range(finish_, end_of_storage_)
é a memória da matriz de backup.
Por exemplo, quanto a um vetor vec. que tem {9, 9, 1, 2, 3, 4} como ponteiro, pode gostar do abaixo.
Então &vec[0]
= start_ (endereço.) (Start_ é equivalente a int * array head)
c++11
Na data()
função de membro de apenas retornar start_
pointer data()
{
return start_; //(equivalent to `value_type*`, array head)
}
Podemos fazer isso usando o método data (). O C ++ 11 fornece esse método.
#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;
}
Se você tem uma função, então você provavelmente terá o seguinte: foo(&array[0], array.size());
. Se você conseguiu entrar em uma situação em que precisa de uma matriz, precisa refatorar, vetores são basicamente matrizes estendidas, sempre deve usá-las.
Você pode fazer algo parecido com isto
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;
}
}
}