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 digunakan std::vector<T>::reserve()
untuk memberi tahu vektor sebelum menambahkan item apa pun daripada mengandalkan shrink_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.