Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Iterator Invalidation ใน C ++


ใน 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
หากรายการถูกลบออกจากตำแหน่งใดๆ ยกเว้นตำแหน่งสิ้นสุด การวนซ้ำทั้งหมดจะถูกยกเลิก
เหมือนกับการแทรกหรือลบ
รายการ
ตัววนซ้ำและการอ้างอิงทั้งหมดจะไม่ได้รับผลกระทบ
เฉพาะตัววนซ้ำหรือการอ้างอิงที่ชี้ไปยังองค์ประกอบที่จะถูกลบเท่านั้นที่จะได้รับผลกระทบ
เหมือนกับการแทรกหรือลบ
ตั้งค่า แผนที่ มัลติเซ็ต มัลติแมป
ตัววนซ้ำและการอ้างอิงทั้งหมดจะไม่ได้รับผลกระทบ
เฉพาะตัววนซ้ำหรือการอ้างอิงที่ชี้ไปยังองค์ประกอบที่จะถูกลบเท่านั้นที่จะได้รับผลกระทบ
----