นี่คือรหัสจากรหัสลบไลบรารีมาตรฐาน C ++
ไม่ถูกต้อง. มันไม่ได้เป็นc ++ มาตรฐานห้องสมุดรหัส มันเป็นหนึ่งในการนำไปใช้ภายในของฟังก์ชันไลบรารีมาตรฐาน C ++ มาตรฐาน C ++ ไม่ได้กำหนดรหัสจริง มัน prescibes ฟังก์ชั่นต้นแบบและพฤติกรรมที่ต้องการremove
remove
ในคำอื่น ๆ : จากจุดภาษาเข้มงวดในมุมมองของรหัสที่คุณจะได้เห็นไม่ได้อยู่ อาจมาจากไฟล์ส่วนหัวบางไฟล์ที่มาพร้อมกับการใช้งานไลบรารีมาตรฐานของคอมไพเลอร์ของคุณ โปรดทราบว่ามาตรฐาน C ++ ไม่จำเป็นต้องมีไฟล์ส่วนหัวเหล่านั้นอยู่ ไฟล์เป็นเพียงวิธีที่สะดวกสำหรับผู้ดำเนินการรวบรวมเพื่อตอบสนองความต้องการสำหรับบรรทัดเช่น#include <algorithm>
(เช่นการทำstd::remove
และฟังก์ชั่นอื่น ๆ ที่มี)
ทำไมไม่เท่าเทียมกันทดสอบเป็นif (!(*first == val))
แทนif (*first != val)
?
เพราะoperator==
ฟังก์ชั่นที่ต้องการเท่านั้น
เมื่อพูดถึงโอเปอเรเตอร์การบรรทุกเกินพิกัดสำหรับประเภทที่กำหนดเองภาษาจะช่วยให้คุณทำสิ่งแปลก ๆ ทุกประเภท คุณเป็นอย่างดีสามารถสร้างชั้นซึ่งมีมากเกินไปแต่ไม่มากเกินไปoperator==
operator!=
หรือแย่กว่านั้นคือคุณสามารถทำงานหนักเกินไปoperator!=
แต่ทำสิ่งที่ไม่เกี่ยวข้องโดยสมบูรณ์
ลองพิจารณาตัวอย่างนี้:
#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());
// ...
}
ถ้าstd::remove
ใช้operator!=
แล้วผลจะแตกต่างกันมาก
operator!=
นอกจากนี้ยังเป็นที่พบบ่อยเมื่อใช้ เพียงใช้การoperator==
ดำเนินการ:bool operator!=(const Foo& other) { return !(*this == other); }