Düzenleme:std::remove
Bu yanıt yazıldığı için dokümanları düzeltildi. Aynı şey için de geçerlidir list::remove
.
Size cpluscplus.com'un nasıl yanlış yapabileceğini gösteren bir örnek vereyim.
std::remove
İşlevini düşünün <algorithm>
.
Gerçek şu ki std::remove
, öğeyi konteynırdan çıkarmıyor. Çünkü std::remove
sadece bir çift yineleyici ile çalışır ve aslında öğeleri içeren konteyner hakkında hiçbir şey bilmez. Aslında, std::remove
temeldeki kapsayıcıyı bilmek mümkün değildir , çünkü yineleyicilerin ait olduğu kapsayıcıyı keşfetmenin bir çift yineleyiciden geçmesinin bir yolu yoktur. Yani std::remove
, öğeleri gerçekten kaldırmaz, çünkü yapamaz . Bir öğeyi kaptan gerçekten kaldırmanın tek yolu , o kapta bir üye işlevi çağırmaktır.
Bu nedenle, öğeleri kaldırmak istiyorsanız, Silme-Kaldırma Deyimini kullanın :
v.erase(std::remove(v.begin(), v.end(), 10), v.end());
Ancak hakkında yanlış bilgi cplusplus.com
verir . Diyor kistd::remove
Bu işlevin , eski değerlerini koruyan ve hala erişilebilir olan yeni sondan sonraki öğeleri değiştirmediğine dikkat edin .
ki bu doğru değil. Aralıktaki yineleyici [new_end, old_end)
hala silinemez, ancak bu eski değerleri korudukları ve hala erişilebilir oldukları anlamına GELMEZ. Onlar belirtilmemiş.
Benzer şekilde, hakkında cplusplus.com
da yanlış bilgi verir list::remove
. Diyor ki ,
Kaldır, genel bir algoritma işlevinin benzer bir davranışla var olduğunu ancak iki yineleyici arasında çalıştığına dikkat edin.
ki bu tamamen yanlış. Küresel kaldır yani std::remove
benzemiyor list::remove
biz eski olduğunu gördüğümüz gibi, gerçekten kaldırmak DEĞİLDİR kaptan öğeleri çünkü olamaz ikincisi (üye fonksiyonu) oysa gerçekten kaldırmak yapar öğeleri önemlidir çünkü .
Bu cevap, küçük bir değişiklikle aşağıdaki konudaki başka bir cevabımdan kopyalandı:
Not: Yukarıdaki konuya yanıt verirken son zamanlarda karşılaştığım için hatırlıyorum. Son iki yılda hatırladığım birçok hata var. Tekrar karşılaşırsam birkaç tane daha ekleyebilirim.