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

C ++ ตัววนซ้ำแบบสองทิศทาง


ตัววนซ้ำที่มีสิทธิ์เข้าถึงลำดับขององค์ประกอบของช่วงจากทั้งทิศทางที่มาจากจุดสิ้นสุดและจากจุดเริ่มต้นเรียกว่า ตัววนซ้ำสองทิศทาง . ตัววนซ้ำสามารถทำงานกับประเภทข้อมูลได้ เช่น แผนผังรายการและชุด

ตัววนซ้ำแบบสองทิศทาง มีคุณสมบัติเหมือนกับ 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