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::removesadece bir çift yineleyici ile çalışır ve aslında öğeleri içeren konteyner hakkında hiçbir şey bilmez. Aslında, std::removetemeldeki 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.comverir . 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.comda 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::removebenzemiyor list::removebiz 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.