Saya lebih suka dua cara:
void copyVecFast(const vec<int>& original)
{
vector<int> newVec;
newVec.reserve(original.size());
copy(original.begin(),original.end(),back_inserter(newVec));
}
void copyVecFast(vec<int>& original)
{
vector<int> newVec;
newVec.swap(original);
}
Bagaimana Anda melakukannya?
Jawaban:
Contoh kedua Anda tidak berfungsi jika Anda mengirim argumen dengan referensi. Apakah yang kamu maksud
Itu akan berhasil, tetapi cara yang lebih mudah adalah
sumber
original
adalah salinan dari argumen fungsi.Mereka tidak sama, kan? Satu adalah salinan, yang lain adalah swap . Oleh karena itu nama fungsi.
Favorit saya adalah:
Di mana
a
danb
adalah vektor.sumber
a = b
maka tidak. Tugas berarti:a
menyamakanb
tanpa mengubahb
. Sebaliknya,std::swap(a, b)
akan bertukar isinya (sehinggab
'ssize
akan sekarang menjadi apa pun yanga
' s telah sebelumnya). Anda mungkin memikirkan operasi pemindahan (seperti yang terjadi pada C ++ 11, tetapi tidak dalam penugasan biasa seperti ini). Langkah seperti itu akan meninggalkanb
dalam keadaan, ahem, "menarik" - lihat stackoverflow.com/questions/17730689/…&&
. Versi itu hanya akan digunakan untuk referensi nilai. Ini tidak akan cocok dengan nilai non-const (sepertib
pada contoh saya di atas). Anda dapat mengubahnyab
menjadi satu dengan mengatakana = std::move(b);
See en.cppreference.com/w/cpp/language/value_category untuk tingkat kompleksitas yang lebih tinggi.Ini adalah cara lain yang valid untuk membuat salinan vektor, cukup gunakan konstruktornya:
Ini bahkan lebih sederhana daripada menggunakan
std::copy
untuk berjalan seluruh vektor dari awal hingga selesai untukstd::back_insert
mereka ke dalam vektor baru.Yang sedang berkata, yang Anda
.swap()
bukan salinan, melainkan menukar dua vektor. Anda akan memodifikasi dokumen asli agar tidak mengandung apa-apa lagi! Yang bukan salinan.sumber
a = b;
karena saya sudah memiliki bidang anggotaa
dan saya hanya perlu menetapkannya dengan nilai baru darib
Jawaban langsung:
=
operatorKita bisa menggunakan fungsi anggota publik
std::vector::operator=
wadahstd::vector
untuk menetapkan nilai dari vektor ke yang lain.Selain itu, fungsi konstruktor juga masuk akal. Fungsi konstruktor dengan vektor lain sebagai parameter (misalnya
x
) membuat wadah dengan salinan setiap elemen dix
, dalam urutan yang sama.Peringatan:
std::vector::swap
std::vector::swap
tidak menyalin vektor ke vektor lain, ia sebenarnya menukar elemen dari dua vektor, seperti namanya. Dengan kata lain, vektor sumber untuk menyalin dari diubah setelahstd::vector::swap
disebut, yang mungkin bukan yang Anda harapkan.Jika elemen-elemen dalam vektor sumber menunjuk ke data lain, maka salinan yang dalam kadang-kadang dibutuhkan.
Menurut wikipedia:
Sebenarnya, saat ini tidak ada cara bawaan di C ++ untuk menyalin secara mendalam. Semua cara yang disebutkan di atas dangkal. Jika salinan yang dalam diperlukan, Anda dapat melintasi vektor dan membuat salinan referensi secara manual. Atau, iterator dapat dipertimbangkan untuk dilintasi. Diskusi tentang iterator berada di luar pertanyaan ini.
Referensi
Halaman
std::vector
di cplusplus.comsumber
Anda tidak boleh menggunakan swap untuk menyalin vektor, itu akan mengubah vektor "asli".
alih-alih yang asli sebagai parameter ke yang baru.
sumber
sumber
Jika vektor SUDAH ada dan Anda hanya ingin menyalin, Anda bisa melakukan ini:
sumber
newVec = oldVec
yang sama dengan salah satu jawaban lainnya.