แก้ไข:เอกสารสำหรับstd::remove
ได้รับการแก้ไขตั้งแต่คำตอบนี้ถูกเขียน list::remove
สิ่งเดียวที่จะนำไปใช้
ให้ฉันยกตัวอย่างให้คุณดูว่า cpluscplus.com จะทำให้มันผิดได้อย่างไร
พิจารณาฟังก์ชั่นจากstd::remove
<algorithm>
ความจริงก็คือstd::remove
ว่าไม่ได้ลบรายการจากภาชนะ มันเป็นเพราะstd::remove
ทำงานร่วมกับ iterators คู่เดียวเท่านั้นและไม่ทราบอะไรเกี่ยวกับภาชนะที่บรรจุสิ่งของจริงๆ ในความเป็นจริงมันเป็นไปไม่ได้ที่std::remove
จะรู้ว่าคอนเทนเนอร์พื้นฐานเพราะมันไม่มีทางที่มันจะไปจากคู่ของตัววนซ้ำเพื่อค้นหาเกี่ยวกับคอนเทนเนอร์ที่ตัววนซ้ำอยู่ ดังนั้นstd::remove
ไม่ได้โดดลบรายการที่เพียงเพราะมันไม่สามารถ วิธีเดียวที่จะจริงเอารายการออกจากภาชนะคือการเรียกใช้ฟังก์ชันสมาชิกในภาชนะที่
ดังนั้นหากคุณต้องการที่จะลบรายการให้ใช้Erase-Remove Idiom :
v.erase(std::remove(v.begin(), v.end(), 10), v.end());
แต่cplusplus.com
จะช่วยให้ไม่ถูกต้องstd::remove
ข้อมูลเกี่ยวกับ มันบอกว่า
ขอให้สังเกตว่าฟังก์ชั่นนี้ไม่เปลี่ยนแปลงองค์ประกอบที่ผ่านมาสิ้นสุดใหม่ซึ่งให้ค่าเก่าของพวกเขาและยังคงสามารถเข้าถึง
ซึ่งไม่ถูกต้อง ตัววนซ้ำในช่วง[new_end, old_end)
ยังคงถูกยกเลิกการลงทะเบียนแต่นั่นไม่ได้หมายความว่าจะเก็บค่าเก่าไว้และยังคงสามารถเข้าถึงได้ พวกเขาไม่ได้ระบุ
ในทำนองเดียวกันcplusplus.com
ให้ข้อมูลที่ไม่ถูกต้องเกี่ยวกับlist::remove
เช่นกัน มันบอกว่า ,
ขอให้สังเกตว่าฟังก์ชั่นอัลกอริทึมทั่วโลกลบอยู่กับพฤติกรรมที่คล้ายกันแต่การดำเนินงานระหว่างสองซ้ำ
ซึ่งผิดอย่างสมบูรณ์ เอาโลกคือstd::remove
ไม่ได้คล้ายกับlist::remove
ที่เราเห็นว่าอดีตไม่ได้โดดลบรายการจากภาชนะเพราะมันไม่สามารถในขณะที่หลัง (ฟังก์ชั่นสมาชิก) จริงๆไม่เอารายการเพราะมันสามารถ
คำตอบนี้ถูกคัดลอกมาจากคำตอบอื่นในหัวข้อต่อไปนี้โดยมีการดัดแปลงเล็กน้อย:
หมายเหตุ:เมื่อไม่นานมานี้เมื่อฉันตอบกระทู้ในหัวข้อด้านบนฉันจำได้ มีข้อผิดพลาดมากมายที่ฉันเจอในช่วงสองปีที่ผ่านมาซึ่งฉันจำไม่ได้ ฉันอาจเพิ่มอีกไม่กี่ในภายหลังถ้าฉันเจออีกครั้ง