คัดลอก / ย้ายการกำหนดใน std :: vector :: erase () และ std :: deque :: erase ()


135

ในขั้นตอนของการตอบคำถามอื่นฉัน stumbled เมื่อกรมธรรม์ที่แตกต่างกันเล็กน้อยและstd::vector::erase()std::deque::erase()

นี่คือสิ่งที่ C ++ 14 พูดเกี่ยวกับstd::deque::erase( [deque.modifiers]/4-6เน้นของฉัน):

ผลกระทบ: ...

ความซับซ้อน:จำนวนการเรียกใช้ตัวทำลายจะเหมือนกับจำนวนขององค์ประกอบที่ลบ แต่จำนวนการเรียกไปยังตัวดำเนินการกำหนดไม่เกินจำนวนองค์ประกอบที่น้อยกว่าก่อนองค์ประกอบที่ถูกลบและจำนวนองค์ประกอบหลังจาก องค์ประกอบที่ถูกลบ

โยน:Tไม่มีอะไรเว้นแต่ยกเว้นจะโยนโดยตัวสร้างสำเนาคอนสตรัคย้ายผู้ประกอบการที่ได้รับมอบหมายหรือผู้ประกอบการที่ได้รับมอบหมายย้ายของ

และนี่คือสิ่งที่กล่าวถึงเกี่ยวกับstd::vector::erase( [vector.modifiers]/3-5):

ผลกระทบ: ...

ซับซ้อน: destructor ของTที่เรียกว่าจำนวนครั้งที่เท่ากับจำนวนขององค์ประกอบลบ แต่ผู้ประกอบการที่ได้รับมอบหมายย้ายของTที่เรียกว่าจำนวนครั้งที่เท่ากับจำนวนขององค์ประกอบในเวกเตอร์หลังจากองค์ประกอบลบ

โยน:Tไม่มีอะไรเว้นแต่ยกเว้นจะโยนโดยตัวสร้างสำเนาคอนสตรัคย้ายผู้ประกอบการที่ได้รับมอบหมายหรือผู้ประกอบการที่ได้รับมอบหมายย้ายของ

อย่างที่คุณเห็นข้อกำหนดข้อยกเว้นสำหรับทั้งสองอย่างนั้นเหมือนกัน แต่std::vectorมีการกล่าวถึงอย่างชัดเจนว่ามีการเรียกตัวดำเนินการกำหนดย้าย

นอกจากนี้ยังมีความจำเป็นสำหรับการTที่จะเป็นMoveAssignableสำหรับerase()การทำงานกับทั้งstd::vectorและstd::deque(ตารางที่ 100) แต่นี่ไม่ได้หมายความถึงการปรากฏตัวของผู้ประกอบการที่ได้รับมอบหมายย้ายหนึ่งสามารถกำหนดผู้ประกอบการที่ได้รับมอบหมายคัดลอกและได้กำหนดดำเนินการกำหนดย้ายและชั้นนี้จะ เป็นMoveAssignable.

ในกรณีนี้ฉันตรวจสอบด้วย GCC และ Clang และstd::vector::erase()เรียกตัวดำเนินการคัดลอกการมอบหมายงานหากไม่มีตัวดำเนินการกำหนดย้ายและstd::deque::erase()ทำแบบเดียวกัน ( DEMO )

คำถามคือ: ฉันพลาดอะไรไปหรือนี่เป็นปัญหา (บรรณาธิการ) ในมาตรฐาน?

ปรับปรุง: ฉันได้ส่งlwg รุ่น #


14
ดูเหมือนข้อบกพร่องในมาตรฐาน
Barry

4
^ ack. ปัญหา LWG น่าจะเหมาะสม
Columbo

4
โดยปกติแล้วร่างมาตรฐานที่ดีเพียงพอ นี่เป็นหนึ่งในกรณีที่คุณควรดูของจริง
Mark Ransom

3
@MarkRansom แหล่งที่มาปัจจุบันของมาตรฐานสำหรับstd :: dequeและstd :: vectorเหมือนกับในคำถามดังนั้นความน่าจะเป็นที่เวอร์ชันสุดท้ายจะแตกต่างกันจึงน้อยมาก
Anton Savin

3
N4141 มีถ้อยคำเหมือนกับ N4140
Brian

คำตอบ:


9

ในการประชุม Lenexa ปัญหาได้รับสถานะทันทีพร้อมกับการแก้ปัญหาที่เสนอ:

ข้อความนี้สัมพันธ์กับ N4296

เปลี่ยน 23.3.3.4 [deque.modifiers] / 5 เป็น:

-5- ซับซ้อน : จำนวนการโทรไปยังเตาเผาที่ของTเป็นเช่นเดียวกับจำนวนขององค์ประกอบลบ แต่จำนวนของการโทรไปยังผู้ประกอบการที่ได้รับมอบหมายของTไม่เกินน้อยกว่าจำนวนขององค์ประกอบก่อนองค์ประกอบลบและ จำนวนองค์ประกอบหลังจากองค์ประกอบที่ถูกลบ

เปลี่ยน 23.3.6.5 [vector.modifiers] / 4 เป็น:

-4- ความซับซ้อน : ตัวทำลายของTเรียกว่าจำนวนครั้งที่เท่ากับจำนวนขององค์ประกอบที่ถูกลบ แต่ตัวดำเนินการกำหนดการย้ายของTเรียกว่าจำนวนครั้งเท่ากับจำนวนองค์ประกอบในเวกเตอร์หลังจากองค์ประกอบที่ถูกลบ

นั่นคือหากการลงมติได้รับการยอมรับจะไม่มีการกล่าวถึงการมอบหมายการย้ายเป็นstd::vector::eraseพิเศษและstd::deque::eraseจะมีการชี้แจงถ้อยคำเล็กน้อย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.