To jest kod z kodu usuwania biblioteki standardowej C ++.
Źle. To nie jest standardowy removekod biblioteki C ++ . Jest to jedna z możliwych implementacji wewnętrznej biblioteki standardowej C ++remove funkcji . Standard C ++ nie określa faktycznego kodu; zawiera prototypy funkcji i wymagane zachowania.
Innymi słowy: ze ścisłego punktu widzenia języka kod, który widzisz , nie istnieje . Może pochodzić z jakiegoś pliku nagłówkowego, który jest dostarczany z implementacją biblioteki standardów kompilatora. Zauważ, że standard C ++ nie wymaga nawet istnienia tych plików nagłówkowych . Pliki są po prostu wygodnym sposobem dla implementujących kompilatory, aby spełnić wymagania dla linii #include <algorithm>(tj. std::removeUdostępnianie i inne funkcje).
Dlaczego nierówność jest testowana jako if (!(*first == val))zamiast if (*first != val)?
Ponieważ operator==wymaga tego tylko funkcja.
Jeśli chodzi o przeciążanie operatorów dla typów niestandardowych, język pozwala robić różne dziwne rzeczy. Możesz bardzo dobrze stworzyć klasę, która ma przeciążoną, operator==ale nie przeciążoną operator!=. Lub nawet gorzej: możesz przeciążaćoperator!= ale sprawić, by robił zupełnie niezwiązane rzeczy.
Rozważmy ten przykład:
#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());
// ...
}
Jeśli zostanie std::removeużyty operator!=, wynik byłby zupełnie inny.
operator!=. Po prostu skorzystaj zoperator==implementacji:bool operator!=(const Foo& other) { return !(*this == other); }