ช่วงที่อิงสำหรับลูปถูกเพิ่มในมาตรฐาน 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 }