Sunting: Dokumentasi untuk std::remove
telah diperbaiki sejak jawaban ini ditulis. Hal yang sama berlaku untuk list::remove
.
Biarkan saya memberi Anda sebuah contoh untuk menunjukkan kepada Anda bagaimana cpluscplus.com bisa salah.
Pertimbangkan std::remove
fungsi dari <algorithm>
.
Faktanya adalah itu std::remove
tidak menghapus item dari wadah. Ini karena hanya std::remove
bekerja dengan sepasang iterator dan tidak tahu apa-apa tentang wadah yang sebenarnya berisi item. Bahkan, tidak mungkin untuk std::remove
mengetahui wadah yang mendasarinya, karena tidak ada cara yang bisa dilakukan oleh sepasang iterator untuk menemukan tentang wadah yang menjadi milik iterator. Jadi std::remove
tidak benar-benar menghapus item, hanya karena tidak bisa . Satu-satunya cara untuk benar - benar menghapus item dari wadah adalah dengan menjalankan fungsi anggota pada wadah itu.
Jadi jika Anda ingin menghapus item, gunakan Erase-Remove Idiom :
v.erase(std::remove(v.begin(), v.end(), 10), v.end());
Tetapi cplusplus.com
memberikan informasi yang salah tentang std::remove
. Ia mengatakan
Perhatikan bahwa fungsi ini tidak mengubah elemen melewati akhir yang baru, yang menjaga nilai-nilai lama dan masih dapat diakses .
itu tidak benar. Iterator dalam rentang [new_end, old_end)
masih dereferenceable, tetapi itu TIDAK berarti bahwa mereka menjaga nilai-nilai lama dan masih dapat diakses. Mereka tidak ditentukan.
Demikian pula, cplusplus.com
memberikan informasi yang salahlist::remove
juga. Dikatakan ,
Perhatikan bahwa fungsi algoritme global, hapus, ada dengan perilaku serupa tetapi beroperasi di antara dua iterator.
yang benar-benar salah. Penghapusan global yaitu std::remove
tidak sama dengan list::remove
, seperti yang kita lihat bahwa yang pertama TIDAK benar-benar menghapus barang dari wadah karena tidak bisa , sedangkan yang terakhir (fungsi anggota) benar-benar menghapus barang karena bisa .
Jawaban ini disalin dari jawaban saya yang lain dalam topik berikut, dengan sedikit modifikasi:
Catatan: Karena saya menemukan ini baru-baru ini ketika saya menjawab dalam topik di atas, saya mengingatnya. Ada banyak kesalahan yang saya temui selama dua tahun terakhir, yang saya tidak ingat. Saya mungkin menambahkan beberapa lagi nanti, jika saya menemukan lagi.