Đây là mã từ thư viện tiêu chuẩn C ++ loại bỏ mã.
Sai lầm. Đây không phải làremove
mã thư viện chuẩn C ++ . Đây là một khả năng thực hiện bên trong của remove
chức năng thư viện chuẩn C ++ . Tiêu chuẩn C ++ không quy định mã thực tế; nó đặt trước các nguyên mẫu chức năng và các hành vi cần thiết.
Nói cách khác: Từ quan điểm ngôn ngữ nghiêm ngặt, mã bạn đang thấy không tồn tại . Nó có thể là từ một số tệp tiêu đề đi kèm với việc triển khai thư viện chuẩn của trình biên dịch của bạn. Lưu ý rằng tiêu chuẩn C ++ thậm chí không yêu cầu các tệp tiêu đề đó tồn tại. Các tệp chỉ là một cách thuận tiện cho người triển khai trình biên dịch để đáp ứng các yêu cầu cho một dòng như #include <algorithm>
(nghĩa là tạo std::remove
và các chức năng khác có sẵn).
Tại sao bất đẳng thức được kiểm tra if (!(*first == val))
thay vì if (*first != val)
?
Bởi vì chỉ operator==
được yêu cầu bởi chức năng.
Khi nói đến quá tải toán tử cho các loại tùy chỉnh, ngôn ngữ cho phép bạn thực hiện tất cả các loại điều kỳ lạ. Bạn rất có thể tạo ra một lớp có quá tải operator==
nhưng không quá tải operator!=
. Hoặc thậm chí tệ hơn: Bạn có thể quá tải operator!=
nhưng để nó làm những việc hoàn toàn không liên quan.
Xem xét ví dụ này:
#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());
// ...
}
Nếu std::remove
được sử dụng operator!=
, thì kết quả sẽ khá khác nhau.
operator!=
. Chỉ cần sử dụngoperator==
triển khai:bool operator!=(const Foo& other) { return !(*this == other); }