@ganuke Você não está copiando, está fazendo um ponteiro que aponta para a matriz real que o vetor está usando internamente. Se você deseja copiar a resposta de GMan explica como
Michael Mrozek
4
@ganuke: O que é "a matriz"? Você precisa fornecer mais informações. Qual é o quadro geral?
GManNickG 27/05
6
@ganuke Você não precisa, apenas precisa de um double*que aponte para os mesmos dados. Esta resposta funciona exatamente nesse caso
Michael Mrozek
6
@guneykayim O vector é o dono da memória, você não deve liberá-lo
Michael Mrozek
23
std::vector<double> v; double* a = v.data();
SinoTrinity
148
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 doubles. Os elementos de um vetor são contíguos.
Caso contrário, você apenas precisará copiar cada elemento:
Nota: use v.size () para obter o número de elementos para a nova matriz: double arr [v.size ()];
Rbaleksandar
7
@rbaleksandar: matrizes não podem ter um tamanho de expressão não constante.
GManNickG
@GManNickG: Funciona, mas acho que há algum mal-entendido aqui. Imagine o seguinte: você tem uma classe com vários ponteiros de vários tipos que precisam apontar para matrizes, que não são conhecidas no momento em que você define sua classe e que são criadas posteriormente liberando vários vetores e usando seu parâmetro de tamanho para determinar quanto espaço deve ser usado. Outro exemplo: uma função simples void arrayTest (unsigned int arrSize), que cria uma matriz (short arr [arrSize];) nela usando seu parâmetro de função para o tamanho.
Rbaleksandar
11
@rbaleksandar Sem mal-entendidos; no C ++ 11 e anteriores, os tamanhos de matriz devem ser expressões constantes integrais. Seu exemplo de função é um uso comum para VLAs em C, mas suportado apenas pela extensão (não padrão) em C ++. Pode ser no C ++ 14: stackoverflow.com/a/17318040/87234 . Mas, a partir de agora, simplesmente não é uma opção padrão.
GManNickG
11
@GManNickG Acho que o @Jet está dizendo que, se você deseja converter um vetor em uma matriz, e pretende dimensionar a matriz usando a size()função do std:vectorque precisará usar newou mallocfazer 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.
É garantido que ele funcione de acordo com o padrão, no entanto, existem algumas ressalvas: em particular, tome cuidado para usar apenas thearrayenquanto thevectorestiver no escopo.
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.
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:
fonte
double*
que aponte para os mesmos dados. Esta resposta funciona exatamente nesse casostd::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())
, ondev
é um vetor dedouble
s. Os elementos de um vetor são contíguos.Caso contrário, você apenas precisará copiar cada elemento:
Certifique-se de que não seja apenas
arr
grande o suficiente, mas quearr
seja preenchido ou que você tenha valores não inicializados.fonte
size()
função dostd:vector
que precisará usarnew
oumalloc
fazer isso. Como já foi indicado (por você) quedouble 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.Para C ++ 11 ,
vector.data()
fará o truque.fonte
É garantido que ele funcione de acordo com o padrão, no entanto, existem algumas ressalvas: em particular, tome cuidado para usar apenas
thearray
enquantothevector
estiver no escopo.fonte
empty()
, caso contrário, isso invocaria o temido UB.Os vetores são efetivamente matrizes sob a pele. Se você tem uma função:
você pode chamar assim:
Você nunca precisa converter um vetor em uma instância de matriz real.
fonte
f( &v[0] );
para sua última linhaQuanto ao
std::vector<int> vec
vec para obterint*
, você pode usar dois métodos:int * arr = & vec [0];
int * arr = vec.data ();
Se você deseja converter qualquer tipo de
T
vetor paraT* array
, basta substituir o acimaint
porT
.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:
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
Nadata()
função de membro de apenas retornar start_fonte
Podemos fazer isso usando o método data (). O C ++ 11 fornece esse método.
Fragmento de código
fonte
fonte
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.fonte
Você pode fazer algo parecido com isto
fonte