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.remove
remove
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::remove
Ve 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::remove
kullanılan operator!=
, sonuç çok farklı olurdu.
operator!=
. Sadeceoperator==
uygulamayı kullanın :bool operator!=(const Foo& other) { return !(*this == other); }