C ++ converter vetor <int> em vetor <duplo>

93

Qual é uma boa maneira limpa de converter um std::vector<int> intVecpara std::vector<double> doubleVec. Ou, de forma mais geral, para converter dois vetores de tipos conversíveis?

Alan Turing
fonte

Respostas:

164

Use std::vectoro construtor de intervalo de:

std::vector<int> intVec;
std::vector<double> doubleVec(intVec.begin(), intVec.end());
James McNellis
fonte
Então, você também pode usar a std::copy(...)função? Você poderia adicionar isso à resposta?
Alan Turing
3
@Lex:, copy(v_int.begin(), v_int.end(), back_inserter(v_float));ouv_float.resize(v_int.size()); copy(v_int.begin(), v_int.end(), v_float.begin());
Jon Purdy
1
má ideia, porque a versão do construtor pré-dimensionará o vetor usando a categoria de iterador para observar que esses são iteradores de acesso aleatório e então reservando espaço suficiente. O redimensionamento antes da cópia é uma inicialização zero que desperdiça.
Michael Goldshteyn
1
@MichaelGoldshteyn Não entendo - se você não especificar o tamanho de antemão, ele será redimensionado automaticamente sempre que a capacidade for excedida (o que copia todos os elementos continuamente). Ok, este é o tempo linear amortizado, mas aposto que ainda é muito mais lento do que uma única inicialização 0. Estou perdendo algo sobre o seu argumento?
Algoman
1
@Algoman consulte std::distance()"Se for um iterador de acesso aleatório, a função usa operador- para calcular isso. Caso contrário, a função usa o operador de aumento (operador ++) repetidamente." Portanto, neste caso, a quantidade de elementos pode ser encontrada subtraindo os iteradores. Se a biblioteca padrão é implementada para usar std :: distance para uma reserva inicial () é outra questão, mas godbolt.org/z/6mcUFh pelo menos contém uma chamada para std :: distance ().
user1556435