Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Vòng lặp for dựa trên phạm vi (range-based for loop) trong C++

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 }