ช่วงที่อิงสำหรับลูปถูกเพิ่มในมาตรฐาน C ++ 11 และเป็นรูปแบบที่กะทัดรัดกว่าเทียบเท่าแบบดั้งเดิม ช่วงที่อิงสำหรับลูปใช้เพื่อวนซ้ำองค์ประกอบของคอนเทนเนอร์ตั้งแต่ต้นจนจบ ไวยากรณ์สำหรับลูปตามช่วงมีดังนี้ −
ไวยากรณ์
for( range-declaration : range-expression ) loop statement
การประกาศช่วง - เป็นการประกาศตัวแปรประเภทเดียวกับประเภทขององค์ประกอบของการแสดงออกช่วง มักใช้คีย์เวิร์ดอัตโนมัติเพื่อระบุประเภทขององค์ประกอบในนิพจน์ช่วงโดยอัตโนมัติ
การแสดงช่วง − นิพจน์ใดๆ ที่ใช้แทนลำดับขององค์ประกอบ สามารถใช้ลำดับขององค์ประกอบในวงเล็บปีกกาได้
คำสั่งวนซ้ำ − body of for loop ที่มีคำสั่งตั้งแต่หนึ่งคำสั่งขึ้นไปที่ต้องดำเนินการซ้ำๆ จนถึงสิ้นสุด range-expression
เปรียบเทียบกับ for loop แบบดั้งเดิม −
// Iterating over array int arr[] = { 10,20,30,40,50 }; for (int num : arr) printf("%d, ",num); Is same as: for ( int i=0;i<5;i++ ) printf("%d, ",arr[i]);
ในที่นี้จะเห็นได้ง่าย ๆ ว่าไม่จำเป็นต้องคำนวณขนาดของอาร์เรย์ใน rangebasedfor loop ดังนั้นจึงไม่จำเป็นต้องมีนิพจน์แบบมีเงื่อนไข นอกจากนี้ยังไม่มีข้อกำหนดของการดำเนินการเพิ่มหรือลด จำนวนในช่วงตามลูปด้านบนสำหรับการวนซ้ำแต่ละครั้งจะนำค่าขององค์ประกอบจากอาร์เรย์ arr[] จากจุดเริ่มต้นจนถึงสิ้นสุด ไม่มีการข้ามองค์ประกอบใดๆ จนกว่าจะมีการดำเนินการคำสั่งการข้ามตัวใดตัวหนึ่ง
พัก − ยุติลูปสำหรับการวนซ้ำที่เหลือทั้งหมด
ดำเนินการต่อ - ข้ามการวนซ้ำปัจจุบันและย้ายไปที่ถัดไป
ไปที่ − ออกจากลูปไปยังคำสั่งตามด้วยเลเบล −
ข้อดีของตามช่วงสำหรับ
-
ใช้งานง่ายและไวยากรณ์ที่เรียบง่าย
-
ไม่จำเป็นต้องคำนวณจำนวนองค์ประกอบในคอนเทนเนอร์หรือขนาดของช่วงนิพจน์
-
หากไม่ทราบประเภทข้อมูลของการประกาศช่วง สามารถใช้ตัวระบุอัตโนมัติแทนได้ ซึ่งจะทำให้เข้ากันได้กับประเภทของนิพจน์ช่วงโดยอัตโนมัติ
-
ไม่จำเป็นต้องมีคำสั่งแบบมีเงื่อนไขหรือคำสั่งเพิ่ม/ลด
-
ดีที่สุดในกรณีที่ต้องทำซ้ำทั้งคอนเทนเนอร์ในครั้งเดียว
ข้อเสียของตามช่วงสำหรับ
-
วนซ้ำทุกองค์ประกอบระหว่าง start() และ end() ไม่สามารถจัดการดัชนีเฉพาะได้
-
การเยี่ยมชมองค์ประกอบอย่างน้อยหนึ่งรายการอีกครั้งและการข้ามกลุ่มขององค์ประกอบไม่สามารถทำได้โดยใช้การวนซ้ำแบบอิงตามช่วง
-
ไม่สามารถวนซ้ำอาร์เรย์ในลำดับที่กลับกัน สำหรับ
ไลบรารีนั้นถูกใช้
ตัวอย่าง
#include <iostream> #include <vector> #include <map> int main(){ int arr[] = { 10,20,30,40,50 }; // traditional for for ( int i=0;i<5;i++ ) printf("%d, ",arr[i]); printf("\n"); for (int num : arr) printf("%d, ",num); printf("\n"); // for character array char str[] = "Hello World"; for (char c : str) printf("%c ",c); printf("\n"); for (char c : "Hello World") printf("%c ",c); printf("\n"); std::map <int, char> MAP({{1, 'A'}, {2, 'B'}, {3, 'C'}}); for (auto m : MAP) printf("{ %d, %c }", m.first,m.second); }
ผลลัพธ์
10, 20, 30, 40, 50, 10, 20, 30, 40, 50, H e l l o W o r l d H e l l o W o r l d { 1, A }{ 2, B }{ 3, C }