Ini adalah kode dari pustaka penghapusan kode standar C ++.
Salah. Ini bukan yang C ++ library standar remove
kode. Ini adalah salah satu implementasi internal dari remove
fungsi pustaka standar C ++ . Standar C ++ tidak menentukan kode aktual; itu menetapkan prototipe fungsi dan perilaku yang diperlukan.
Dengan kata lain: Dari sudut pandang bahasa yang ketat, kode yang Anda lihat tidak ada . Mungkin dari beberapa file header yang datang dengan implementasi perpustakaan standar compiler Anda. Perhatikan bahwa standar C ++ bahkan tidak mengharuskan file header itu ada. File hanyalah cara yang nyaman bagi implementator kompiler untuk memenuhi persyaratan untuk jalur seperti #include <algorithm>
(yaitu membuat std::remove
dan fungsi lainnya tersedia).
Mengapa ketimpangan diuji sebagai if (!(*first == val))
ganti if (*first != val)
?
Karena hanya operator==
diperlukan oleh fungsi.
Ketika berbicara tentang overloading operator untuk tipe khusus, bahasa ini memungkinkan Anda melakukan semua jenis hal aneh. Anda bisa membuat kelas yang memiliki kelebihan operator==
tetapi tidak kelebihan operator!=
. Atau bahkan lebih buruk: Anda bisa kelebihan beban operator!=
tetapi membuatnya melakukan hal-hal yang sama sekali tidak terkait.
Pertimbangkan contoh ini:
#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());
// ...
}
Jika std::remove
digunakan operator!=
, maka hasilnya akan sangat berbeda.
operator!=
. Cukup gunakanoperator==
implementasinya:bool operator!=(const Foo& other) { return !(*this == other); }