Saya perlu menyalin std::set
ke std::vector
:
std::set <double> input;
input.insert(5);
input.insert(6);
std::vector <double> output;
std::copy(input.begin(), input.end(), output.begin()); //Error: Vector iterator not dereferencable
Dimana masalahnya?
assign()
fungsi:output.assign(input.begin(), input.end());
Jawaban:
Anda perlu menggunakan
back_inserter
:std::copy
tidak menambahkan elemen ke wadah yang Anda masukkan: tidak bisa; hanya memiliki iterator ke dalam wadah. Karena itu, jika Anda meneruskan iterator keluaran langsung kestd::copy
, Anda harus memastikan itu menunjuk ke kisaran yang setidaknya cukup besar untuk menahan rentang input.std::back_inserter
membuat iterator keluaran yang memanggilpush_back
wadah untuk setiap elemen, sehingga setiap elemen dimasukkan ke dalam wadah. Atau, Anda bisa membuat sejumlah elemen dalamstd::vector
untuk menahan rentang yang disalin:Atau, Anda bisa menggunakan
std::vector
konstruktor rentang:sumber
output.insert(output.end(), input.begin(), input.end());
?output.insert(output.cend(), input.cbegin(), input.cend());
Bagaimana menurut Anda? Terima kasih.input,size()
entri kosong dan kemudian menambahkan append setelah itu. Saya pikir Anda bermaksud menggunakannyastd::vector<double> output; output.reserve(input.size()); std::copy(...);
.Cukup gunakan konstruktor untuk vektor yang mengambil iterator:
Asumsikan Anda hanya ingin konten s di v, dan tidak ada di v sebelum menyalin data ke dalamnya.
sumber
inilah alternatif lain menggunakan
vector::assign
:sumber
Anda belum memesan ruang yang cukup di objek vektor untuk menyimpan konten set Anda.
sumber
Saya pikir cara yang paling efisien adalah dengan melakukan pra-alokasi dan kemudian menggunakan elemen:
Dengan begitu kita hanya akan memanggil copy constructor untuk setiap elemen sebagai lawan memanggil constructor default terlebih dahulu dan kemudian menyalin operator penugasan untuk solusi lain yang tercantum di atas. Penjelasan lebih lanjut di bawah ini.
back_inserter dapat digunakan tetapi akan memanggil push_back () pada vektor ( https://en.cppreference.com/w/cpp/iterator/back_insert_iterator ). emplace_back () lebih efisien karena ia menghindari membuat sementara ketika menggunakan push_back () . Ini bukan masalah dengan tipe yang dibangun secara sepele tetapi akan menjadi implikasi kinerja untuk tipe yang tidak dibangun dengan sepele (misalnya std :: string).
Kita perlu menghindari membangun vektor dengan argumen ukuran yang menyebabkan semua elemen dibangun secara default (tanpa biaya). Seperti dengan solusi menggunakan std :: copy () , misalnya.
Dan, akhirnya, metode vector :: assign () atau konstruktor yang mengambil rentang iterator bukanlah pilihan yang baik karena mereka akan memanggil std :: distance () (untuk mengetahui jumlah elemen) pada set iterators. Ini akan menyebabkan iterasi tambahan yang tidak diinginkan melalui semua elemen set karena set adalah struktur data Binary Search Tree dan tidak menerapkan iterator akses acak.
Semoga itu bisa membantu.
sumber
back_inserter
tidak perlu digunakanstd::copy
tidak dapat digunakan untuk memasukkan ke dalam wadah kosong. Untuk melakukan itu, Anda perlu menggunakan insert_iterator seperti:sumber