C ++ mengubah vektor <int> menjadi vektor <double>

97

Apa cara yang bersih baik untuk mengkonversi std::vector<int> intVecke std::vector<double> doubleVec. Atau, secara lebih umum, untuk mengubah dua vektor tipe konversi?

Alan Turing
sumber

Jawaban:

171

Gunakan std::vectorkonstruktor rentang:

std::vector<int> intVec;
std::vector<double> doubleVec(intVec.begin(), intVec.end());
James McNellis
sumber
Jadi, Anda juga bisa menggunakan std::copy(...)fungsinya? Bisakah Anda menambahkan itu ke jawabannya?
Alan Turing
3
@ Lex:, copy(v_int.begin(), v_int.end(), back_inserter(v_float));atauv_float.resize(v_int.size()); copy(v_int.begin(), v_int.end(), v_float.begin());
Jon Purdy
1
Ide buruk, karena versi konstruktor akan mempresize vektor dengan menggunakan kategori iterator untuk mencatat bahwa itu adalah iterator akses acak dan kemudian menyediakan ruang yang cukup. Mengubah ukuran sebelum menyalin adalah inisialisasi nol yang sia-sia.
Michael Goldshteyn
1
@MichaelGoldshteyn Saya tidak mengerti - jika Anda tidak menentukan ukurannya sebelumnya, maka ukurannya akan diubah secara otomatis setiap kali kapasitas terlampaui (yang menyalin semua elemen berulang kali). Oke, ini adalah waktu linier diamortisasi, tapi saya yakin itu masih jauh lebih lambat daripada inisialisasi 0 tunggal. Apakah saya melewatkan sesuatu tentang argumen Anda?
Algoman
2
@Algoman lihat std::distance()"Jika ini adalah iterator akses-acak, fungsi menggunakan operator- untuk menghitung ini. Jika tidak, fungsi menggunakan operator peningkatan (operator ++) berulang kali." Jadi dalam hal ini jumlah elemen dapat ditemukan dengan mengurangkan iterator. Apakah pustaka standar diimplementasikan untuk menggunakan std :: distance untuk cadangan awal () adalah pertanyaan lain, tapi godbolt.org/z/6mcUFh setidaknya berisi panggilan ke std :: distance ().
pengguna1556435