Saya menemukan pernyataan ini:
resize(n)
- Mengubah ukuran wadah sehingga mengandung elemen 'n'.
shrink_to_fit()
- Mengurangi kapasitas wadah agar sesuai dengan ukurannya dan menghancurkan semua elemen di luar kapasitas.
Apakah ada perbedaan yang signifikan antara fungsi-fungsi ini? mereka berada di bawah vektor di c ++
shrink_to_fit
mengubah kapasitas.capacity
dansize
?Jawaban:
Vektor memiliki dua atribut "panjang" yang memiliki arti berbeda:
size
adalah jumlah elemen yang dapat digunakan dalam vektor. Ini adalah jumlah barang yang telah Anda simpan. Ini adalah panjang konseptual.capacity
adalah berapa banyak elemen yang sesuai dengan jumlah memori yang saat ini dialokasikan oleh vektor.capacity >= size
harus selalu benar, tetapi tidak ada alasan bagi mereka untuk selalu sama. Misalnya, ketika Anda menghapus suatu elemen, menyusutkan alokasi akan membutuhkan membuat alokasi baru, satu ember lebih kecil dan memindahkan isi yang tersisa ke atas ("alokasikan, pindahkan, bebas").Demikian pula, jika
capacity == size
dan Anda menambahkan elemen, vektor dapat menumbuhkan alokasi dengan satu elemen (operasi "alokasikan, pindahkan, bebas") yang lain, tetapi biasanya Anda akan menambahkan lebih dari satu elemen. Jika kapasitas perlu ditingkatkan, vektor akan meningkatkan kapasitasnya dengan lebih dari satu elemen sehingga Anda dapat menambahkan beberapa elemen lagi sebelum perlu memindahkan semuanya lagi.Dengan pengetahuan ini, kami dapat menjawab pertanyaan Anda:
std::vector<T>::resize()
mengubah ukuran array. Jika Anda mengubah ukurannya lebih kecil dari ukuran saat ini, objek yang berlebih dirusak. Jika Anda mengubah ukurannya lebih besar dari ukurannya saat ini, objek "baru" yang ditambahkan pada akhirnya diinisialisasi awal.std::vector<T>::shrink_to_fit()
meminta kapasitas untuk diubah agar sesuai dengan ukuran saat ini. (Implementasi dapat atau tidak menghormati permintaan ini. Mereka mungkin mengurangi kapasitas tetapi tidak membuatnya sama dengan ukuran. Mereka mungkin tidak melakukan apa-apa sama sekali.) Jika permintaan terpenuhi, ini akan membuang sebagian atau semua bagian yang tidak terpakai dari alokasi vektor. Anda biasanya menggunakan ini ketika Anda selesai membangun vektor dan tidak akan pernah menambahkan item lain ke sana. (Jika Anda tahu sebelumnya berapa banyak item yang akan Anda tambahkan, akan lebih baik digunakanstd::vector<T>::reserve()
untuk memberi tahu vektor sebelum menambahkan item apa pun daripada mengandalkanshrink_to_fit
melakukan apa pun.)Jadi Anda gunakan
resize()
untuk mengubah berapa banyak barang secara konseptual dalam vektor.Anda menggunakan
shrink_to_fit()
untuk meminimalkan ruang berlebih yang telah dialokasikan vektor secara internal tanpa mengubah berapa banyak barang secara konseptual dalam vektor.sumber
shrink_to_fit
tidak semuanya atau tidak sama sekali. Suatu implementasi dapat mengurangi kapasitas bagian jalan. Sebagai contoh, pertimbangkan implementasi yang membatasi kapasitas vektor untuk kekuatan dua.Itu adalah kesalahan karakteristik apa yang terjadi. Secara aman, menghancurkan semua elemen di luar bagian kapasitas tidak akurat.
Dalam C ++, ketika memori dinamis digunakan untuk objek, ada dua langkah:
Ketika objek dalam memori yang dialokasikan secara dinamis dihapus, ada juga dua langkah, yang mencerminkan langkah-langkah konstruksi tetapi dalam urutan terbalik:
Memori yang dialokasikan di luar ukuran wadah hanyalah penyangga. Mereka tidak memegang benda yang diinisialisasi dengan benar. Itu hanya memori mentah.
shrink_to_fit()
memastikan bahwa memori tambahan tidak ada tetapi tidak ada objek di lokasi tersebut. Oleh karena itu, tidak ada yang hancur, hanya memori yang tidak dapat dialokasikan.sumber
Menurut C ++ Standard relatif terhadap
shrink_to_fit
dan relatif terhadap
resize
Jelas bahwa fungsinya melakukan hal yang berbeda. Selain itu fungsi pertama tidak memiliki parameter sedangkan fungsi kedua bahkan memiliki dua parameter. Fungsi
shrink_to_fit
tidak mengubah ukuran wadah meskipun dapat mengalokasikan kembali memori.sumber