Ini adalah kode dari pustaka penghapusan kode standar C ++.
Salah. Ini bukan yang C ++ library standar removekode. Ini adalah salah satu implementasi internal dari removefungsi 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::removedan 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::removedigunakan operator!=, maka hasilnya akan sangat berbeda.
operator!=. Cukup gunakanoperator==implementasinya:bool operator!=(const Foo& other) { return !(*this == other); }