Bu kod, C ++ standart kitaplığı kaldırma kodudur.
Yanlış. O değil C ++ standart kütüphanesi kodu. Bu var bir olası iç uygulama C ++ standart kütüphane fonksiyonu. C ++ standardı gerçek kodu yazmaz; fonksiyon prototipleri ve gerekli davranışları öngörür.removeremove
Başka bir deyişle: Katı bir dil açısından gördüğünüz kod mevcut değildir . Derleyicinizin standart kitaplık uygulamasıyla birlikte gelen bazı başlık dosyasından olabilir. C ++ standardının bu başlık dosyalarının varlığını bile gerektirmediğini unutmayın . Dosyalar, derleyici uygulayıcılarının bir satırın gereksinimlerini karşılaması için uygun bir yoldur #include <algorithm>(örn. std::removeVe diğer işlevler kullanılabilir).
Eşitsizlik neden if (!(*first == val))yerine test ediliyor if (*first != val)?
Çünkü sadece operator==fonksiyon gerekli.
Özel türler için operatör aşırı yüklenmesi söz konusu olduğunda, dil her türlü garip şeyi yapmanıza izin verir. Aşırı yüklenmiş operator==ancak aşırı yüklü olmayan bir sınıf oluşturabilirsiniz operator!=. Ya da daha da kötüsü: Aşırı yükleyebilirsiniz, operator!=ancak tamamen ilgisiz şeyler yapmasını sağlayabilirsiniz .
Bu örneği düşünün:
#include <algorithm>
#include <vector>
struct Example
{
int i;
Example() : i(0) {}
bool operator==(Example const& other) const
{
return i == other.i;
}
bool operator!=(Example const& other) const
{
return i == 5; // weird, but nothing stops you
// from doing so
}
};
int main()
{
std::vector<Example> v(10);
// ...
auto it = std::remove(v.begin(), v.end(), Example());
// ...
}
Eğer std::removekullanılan operator!=, sonuç çok farklı olurdu.
operator!=. Sadeceoperator==uygulamayı kullanın :bool operator!=(const Foo& other) { return !(*this == other); }