Menu
CoddyTech

Vòng lặp for dựa trên phạm vi

Thuộc phần Logic và luồng chương trình trong hành trình C++ của Coddy. Bài học 15 trên 56.

Dù vòng lặp for truyền thống dùng chỉ số hoạt động tốt khi duyệt qua các vector, C++ còn có một giải pháp tinh gọn hơn: vòng lặp for dựa trên phạm vi. Cú pháp hiện đại này loại bỏ nhu cầu quản lý chỉ số thủ công, giúp code của bạn gọn gàng và dễ đọc hơn.

Vòng lặp for dựa trên phạm vi tự động xử lý các chi tiết về lần lặp cho bạn. Thay vì quản lý một biến chỉ số, bạn chỉ cần chỉ định việc muốn làm với từng phần tử:

std::vector<std::string> names = {"Alice", "Bob", "Charlie"};

for (const std::string& name : names) {
    std::cout << name << std::endl;
}

Vòng lặp này thực hiện chính xác điều tương tự như cách làm truyền thống dựa trên chỉ số, nhưng có cú pháp đơn giản hơn nhiều. Biến name tự động nhận giá trị của từng phần tử trong vector, lần lượt từng phần tử một.

Bạn có thể nhận thấy ký hiệu & trong khai báo vòng lặp: const std::string& name. Trong ngữ cảnh này, & không có nghĩa là “địa chỉ của” như bạn có thể đã thấy trước đây. Ở đây, ký hiệu này khai báo name là một tham chiếu (bí danh) trực tiếp đến từng phần tử trong vector, thay vì tạo một bản sao của phần tử đó. Hãy hình dung đây là cách đặt một tên mới cho cùng một phần dữ liệu, tương tự như dùng con trỏ đến phần tử đó, nhưng bạn không cần giải tham chiếu nó bên trong thân vòng lặp.

Từ khóa const là một biện pháp an toàn: nó ngăn bạn vô tình sửa đổi phần tử thông qua bí danh bên trong thân vòng lặp. Bản thân bí danh vẫn chuyển đến từng phần tử mới sau mỗi lần lặp. Nội dung bạn truy cập thông qua bí danh mới được giữ nguyên, chứ không phải quá trình lặp của vòng lặp.

Vòng lặp for dựa trên phạm vi không chỉ dễ đọc hơn mà còn an toàn hơn, vì bạn không cần tự quản lý chỉ số nên không có nguy cơ gặp lỗi chỉ số. Vòng lặp này hoạt động với mọi vùng chứa hỗ trợ lặp, nên là công cụ linh hoạt để xử lý các tập hợp dữ liệu trong C++.

challenge icon

Thử thách

Dễ

Tạo một chương trình minh họa vòng lặp for dựa trên phạm vi bằng cách xử lý một tập hợp tên thành phố và hiển thị tên cùng số ký tự của từng thành phố.

Chương trình sẽ nhận các dữ liệu đầu vào sau:

  • Một số nguyên n biểu thị số thành phố
  • Sau đó là n chuỗi biểu thị tên các thành phố

Chương trình của bạn cần:

  1. Tạo một std::vector<std::string> có tên cities
  2. Dùng push_back() để thêm từng tên trong số n tên thành phố vào vector
  3. Dùng vòng lặp for dựa trên phạm vi để duyệt qua vector
  4. Với mỗi thành phố trong vòng lặp, in tên thành phố, theo sau là độ dài của tên bằng phương thức .length()
  5. Sau vòng lặp, in tổng số thành phố đã xử lý bằng phương thức .size() của vector

Dùng chính xác định dạng đầu ra sau:

City: [city name] (Length: [number of characters])\nCity: [city name] (Length: [number of characters])\n...\nTotal cities processed: [total count]

Vòng lặp for dựa trên phạm vi cần dùng cú pháp for (const std::string& city : cities) để duyệt qua từng phần tử trong vector. Dùng city.length() để lấy số ký tự trong tên mỗi thành phố.

Tự làm thử

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main() {
    // Đọc số lượng thành phố
    int n;
    cin >> n;
    
    // Tạo một vector để lưu tên các thành phố
    vector<string> cities;
    
    // Đọc tên các thành phố và thêm vào vector
    for (int i = 0; i < n; i++) {
        string city;
        cin >> city;
        cities.push_back(city);
    }
    
    // TODO: Viết code của bạn bên dưới
    // Dùng vòng lặp for (for loop) dựa trên phạm vi để duyệt vector cities
    // In ra từng thành phố cùng độ dài tên theo định dạng đã cho
    // Sau vòng lặp, in ra tổng số thành phố đã xử lý
    
    return 0;
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng chương trình

Tự luyện tập: Trình biên dịch C++ online