ตัววนซ้ำที่มีสิทธิ์เข้าถึงลำดับขององค์ประกอบของช่วงจากทั้งทิศทางที่มาจากจุดสิ้นสุดและจากจุดเริ่มต้นเรียกว่า ตัววนซ้ำสองทิศทาง . ตัววนซ้ำสามารถทำงานกับประเภทข้อมูลได้ เช่น แผนผังรายการและชุด
ตัววนซ้ำแบบสองทิศทาง มีคุณสมบัติเหมือนกับ forwarding iterators โดยมีความแตกต่างเพียงอย่างเดียวที่สามารถลดลงได้ -
ทรัพย์สิน | นิพจน์ที่ถูกต้อง |
---|---|
สร้างได้เริ่มต้น คัดลอก-สร้างได้, คัดลอกมอบหมายและทำลายได้ | X ก; X ข(ก); ข =ก; |
เปรียบเทียบความเท่าเทียมกันได้โดยใช้ตัวดำเนินการความเท่าเทียมกัน/ความไม่เท่าเทียมกัน (มีความหมายเมื่อค่าตัววนซ้ำทั้งสองวนซ้ำในลำดับพื้นฐานเดียวกัน) | a ==b !=ข |
สามารถยกเลิกการอ้างอิงเป็น rvalue ได้ (หากอยู่ในสถานะที่สามารถอ้างอิงได้) | *a a->m |
สำหรับตัววนซ้ำที่ไม่แน่นอน (ตัววนซ้ำแบบไม่คงที่):สามารถยกเลิกการอ้างอิงเป็น lvalue ได้ (หากอยู่ในสถานะที่อ้างอิงได้) | *a =t |
สามารถเพิ่มได้ (หากอยู่ในสถานะที่สามารถอ้างอิงได้) ผลลัพธ์เป็นทั้ง dereferenceable หรือ iterator ที่ผ่านมาสุดท้าย ตัววนซ้ำสองตัวที่เปรียบเทียบเท่ากัน ให้เปรียบเทียบเสมอกันหลังจากที่ทั้งคู่เพิ่มขึ้น | ++a ++ *a++ |
สามารถลดลงได้ (หากค่าตัววนซ้ำที่อ้างอิงได้อยู่ข้างหน้า) | --a ก-- *a-- |
Lvalues สามารถสับเปลี่ยนได้ | สลับ(a,b) |
โดยที่ X คือ ตัววนซ้ำสองทิศทาง , a และ b เป็นอ็อบเจ็กต์ของประเภท iterator นี้ และ t เป็นอ็อบเจ็กต์ประเภทที่ชี้โดยประเภท iterator (หรือประเภทอื่นที่สามารถกำหนดให้กับ lvalue ส่งคืนโดย dereference วัตถุประเภท X)
แนวคิดของตัววนซ้ำแบบสองทิศทางใน C++
-
ตัววนซ้ำแบบสองทิศทางสนับสนุนคุณลักษณะทั้งหมดของตัววนซ้ำการส่งต่อ และตัวดำเนินการลดคำนำหน้าและหลังการแก้ไข
-
ตัววนซ้ำประเภทนี้สามารถเข้าถึงองค์ประกอบได้ทั้งสองทิศทาง เช่น ไปสิ้นสุดและไปยังจุดเริ่มต้น
-
ตัววนซ้ำการเข้าถึงโดยสุ่มยังเป็นประเภทของตัววนซ้ำแบบสองทิศทางอีกด้วย
-
ตัววนซ้ำแบบสองทิศทางมีคุณสมบัติของตัววนซ้ำการส่งต่อ แต่ข้อแตกต่างเพียงอย่างเดียวคือตัววนซ้ำนี้สามารถลดค่าได้
Input: 1 2 3 4 5 6 7 8 9 10 Output: 10 9 8 7 6 5 4 3 2 1
ตัวอย่าง
#include <iostream> #include<iterator> #include<vector> using namespace std; int main() { vector<int> vec{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; vector<int> ::iterator it; vector<int> :: reverse_iterator rev_it; for(it = vec.begin(); it != vec.end(); it++) cout<<*it<<" "; cout<< endl; for(rev_it = vec.rbegin(); rev_it!= vec.rend(); rev_it++) cout<<*rev_it<<" "; }
ผลลัพธ์
1 2 3 4 5 6 7 8 9 10 10 9 8 7 6 5 4 3 2 1