ใน C++ เรามีคอนเทนเนอร์ที่แตกต่างกัน เช่น เวกเตอร์ รายการ ชุด แผนที่ ฯลฯ ในการวนซ้ำผ่านคอนเทนเนอร์เหล่านี้ เราสามารถใช้ตัววนซ้ำได้ เราควรระมัดระวังเมื่อเราใช้ตัววนซ้ำใน C++ เมื่อเราใช้การวนซ้ำบนคอนเทนเนอร์ บางครั้งอาจใช้การไม่ได้ ถ้ารูปร่าง ขนาด เปลี่ยนไป เราก็เจอปัญหาแบบนี้ ในตัวอย่างต่อไปนี้ เราสามารถระบุปัญหาของการทำให้เป็นโมฆะได้
โค้ดตัวอย่าง
#include <iostream> #include <vector> using namespace std; int main() { vector <int> vec{11, 55, 110, 155, 220}; for (auto it=vec.begin(); it!=vec.end(); it++) if ((*it) == 110) vec.push_back(89); //inserting a new value while iterating the vector for (auto it=vec.begin();it!=vec.end();it++) cout << (*it) << " "; }
ผลลัพธ์
11 55 110 155 220 89 89
ในโปรแกรมนี้ เราสามารถได้ผลลัพธ์ประเภทต่างๆ ที่นี่ไม่ได้กำหนดขนาดของเวกเตอร์ไว้ก่อนหน้านี้ ค่าบางอย่างมีไว้สำหรับการเริ่มต้น ขณะนี้เรากำลังเพิ่มค่า onemore ในกรณีนี้ ถ้าเวกเตอร์ไม่มีที่ว่าง มันจะสร้างบล็อกหน่วยความจำใหม่ตอนรันไทม์ และรายการทั้งหมดจะถูกคัดลอก แต่ตัววนซ้ำจะชี้ไปที่ที่อยู่ก่อนหน้า การทำเช่นนี้อาจก่อให้เกิดการโมฆะได้
ให้เราดูกฎบางอย่างสำหรับการทำให้เป็นโมฆะของตัววนซ้ำ
| การแทรก | Erasure | การปรับขนาด |
---|---|---|---|
เวกเตอร์ | ตัววนซ้ำทั้งหมดซึ่งชี้องค์ประกอบก่อนจุดแทรก จะไม่ได้รับผลกระทบ แต่ส่วนอื่นๆ จะใช้งานไม่ได้ และถ้าขนาดของเวกเตอร์เพิ่มขึ้น การวนซ้ำทั้งหมดจะถูกยกเลิก | ตัววนซ้ำและการอ้างอิงทั้งหมดซึ่งอยู่หลังจุดลบจะไม่ถูกต้อง | เหมือนกับการแทรกหรือลบ |
ดีค | ตัววนซ้ำและการอ้างอิงทั้งหมดจะถูกยกเลิกหากไม่ได้แทรกรายการที่แทรกที่ส่วนท้ายของ deque | หากรายการถูกลบออกจากตำแหน่งใดๆ ยกเว้นตำแหน่งสิ้นสุด การวนซ้ำทั้งหมดจะถูกยกเลิก | เหมือนกับการแทรกหรือลบ |
รายการ | ตัววนซ้ำและการอ้างอิงทั้งหมดจะไม่ได้รับผลกระทบ | เฉพาะตัววนซ้ำหรือการอ้างอิงที่ชี้ไปยังองค์ประกอบที่จะถูกลบเท่านั้นที่จะได้รับผลกระทบ | เหมือนกับการแทรกหรือลบ |
ตั้งค่า แผนที่ มัลติเซ็ต มัลติแมป | ตัววนซ้ำและการอ้างอิงทั้งหมดจะไม่ได้รับผลกระทบ | เฉพาะตัววนซ้ำหรือการอ้างอิงที่ชี้ไปยังองค์ประกอบที่จะถูกลบเท่านั้นที่จะได้รับผลกระทบ | ---- |