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++.
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
nbiểu thị số thành phố - Sau đó là
nchuỗi biểu thị tên các thành phố
Chương trình của bạn cần:
- Tạo một
std::vector<std::string>có têncities - Dùng
push_back()để thêm từng tên trong sốntên thành phố vào vector - Dùng vòng lặp for dựa trên phạm vi để duyệt qua vector
- 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() - 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;
}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
1Con trỏ và bộ nhớ
Con trỏ là gì?Toán tử lấy địa chỉToán tử giải tham chiếuCon trỏ nullCon trỏ và mảngBộ nhớ động với newGiải phóng bộ nhớ với deleteÔn tập: luyện tập về con trỏ2Vector (mảng động)
Giới thiệu std::vectorTạo vectorThêm phần tửTruy cập phần tửKích thước vectorDuyệt bằng vòng lặp forVòng lặp for dựa trên phạm viXóa phần tửÔn tập: các thao tác với vector5Dự án: Công cụ quản lý hàng tồn kho
Thiết lập dự ánThêm và cập nhật mặt hàng3Dự án: Công cụ danh sách công việc
Tổng quan dự ánThêm công việc6Tập hợp (các phần tử duy nhất)
Giới thiệu std::setTạo tập hợp và thêm phần tửKiểm tra phần tửXóa phần tửDuyệt qua tập hợpÔn tập: các số duy nhấtTự luyện tập: Trình biên dịch C++ online