C ++ converte il vettore <int> in vettore <double>


93

Qual è un buon modo pulito per convertire un file std::vector<int> intVecin std::vector<double> doubleVec. O, più in generale, convertire due vettori di tipi convertibili?

Risposte:


164

Usa std::vectoril costruttore dell'intervallo di:

std::vector<int> intVec;
std::vector<double> doubleVec(intVec.begin(), intVec.end());

Quindi, potresti anche usare la std::copy(...)funzione allora? Potresti aggiungerlo alla risposta?
Alan Turing

3
@ Lex:, copy(v_int.begin(), v_int.end(), back_inserter(v_float));ov_float.resize(v_int.size()); copy(v_int.begin(), v_int.end(), v_float.begin());
Jon Purdy,

1
cattiva idea, perché la versione del costruttore presize il vettore utilizzando la categoria iteratore per notare che quelli sono iteratori ad accesso casuale e quindi riservano spazio sufficiente. Il ridimensionamento prima della copia è un'inizializzazione zero dispendiosa.
Michael Goldshteyn

1
@MichaelGoldshteyn Non capisco: se non specifichi la dimensione in anticipo, verrà ridimensionata automaticamente ogni volta che viene superata la capacità (che copia tutti gli elementi più e più volte). Ok, questo è un tempo lineare ammortizzato, ma scommetto che è ancora molto più lento di una singola inizializzazione 0. Mi sto perdendo qualcosa nella tua discussione?
Algoman

1
@Algoman vede std::distance()"Se si tratta di un iteratore ad accesso casuale, la funzione utilizza l'operatore- per calcolarlo. In caso contrario, la funzione utilizza ripetutamente l'operatore di aumento (operatore ++)." Quindi in questo caso la quantità di elementi potrebbe essere trovata sottraendo gli iteratori. Se la libreria standard è implementata per usare std :: distance per una riserva iniziale () è un'altra domanda, ma godbolt.org/z/6mcUFh contiene almeno una chiamata a std :: distance ().
user1556435
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.