Vòng lặp for dựa trên phạm vi được thêm trong chuẩn C++11, là dạng gọn gàng hơn của vòng lặp truyền thống. Dùng để lặp qua các phần tử của container từ đầu đến cuối.
Cú pháp
for (khai_bao_pham_vi : bieu_thuc_pham_vi) cau_lenh_vong_lap
khai_bao_pham_vi - khai báo biến cùng kiểu với phần tử của bieu_thuc_pham_vi. Thường dùng từ khóa auto để tự động xác định kiểu.
bieu_thuc_pham_vi - bất kỳ biểu thức nào biểu diễn dãy phần tử. Cũng có thể dùng dãy trong ngoặc nhọn.
cau_lenh_vong_lap - thân vòng lặp chứa một hoặc nhiều câu lệnh thực hiện lặp lại đến cuối phạm vi.
So sánh với for truyền thống
// Lặp mảng
int arr[] = { 10, 20, 30, 40, 50 };
for (int num : arr)
printf("%d, ", num);
Tương đương:
for (int i = 0; i < 5; i++)
printf("%d, ", arr[i]);
Không cần tính kích thước mảng, không cần biểu thức điều kiện, không cần tăng/giảm. Biến num mỗi vòng lấy giá trị phần tử từ arr[] từ đầu đến cuối. Không bỏ qua phần tử trừ khi dùng câu lệnh nhảy.
break - thoát vòng lặp hoàn toàn.
continue - bỏ qua vòng hiện tại, sang vòng tiếp theo.
goto - nhảy ra khỏi vòng lặp đến nhãn.
Ưu điểm
- Cú pháp đơn giản, dễ dùng.
- Không cần tính số phần tử hoặc kích thước phạm vi.
- Dùng auto nếu kiểu không biết, tự động tương thích.
- Không cần câu lệnh điều kiện hoặc tăng/giảm.
- Tốt nhất khi duyệt toàn bộ container một lần.
Nhược điểm
- Lặp qua mọi phần tử giữa begin() và end(). Không thể xử lý chỉ số cụ thể.
- Không thể quay lại hoặc bỏ qua nhóm phần tử.
- Không thể lặp ngược. Cần thư viện <boost/range/adaptor/reversed.hpp>.
Ví dụ
#include <iostream>
#include <vector>
#include <map>
int main() {
int arr[] = { 10, 20, 30, 40, 50 };
// for truyền thống
for (int i = 0; i < 5; i++)
printf("%d, ", arr[i]);
printf("\n");
for (int num : arr)
printf("%d, ", num);
printf("\n");
// mảng ký tự
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);
}
Đầu ra
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 }