Trang tài liệu
Khóa học C++ nền tảng
Chương 11. Thư viện mẫu chuẩn (STL)
Trình vòng lặp

Trình vòng lặp

Trình vòng lặp là các đối tượng trong Thư viện chuẩn C++ (STL) giúp chúng ta duyệt qua các vùng chứa như mảng, danh sách và vecto. Về cơ bản, chúng hoạt động như một cầu nối giữa các lớp vùng lưu trữ và các thuật toán. Trình vòng lặp hoạt động tương tự như con trỏ nhưng cung cấp một cách tổng quát và trừu tượng hơn để truy cập các phần tử trong vùng lưu trữ. Có nhiều loại trình vòng lặp khác nhau mà bạn sẽ gặp tùy thuộc vào trường hợp sử dụng của chúng:

  • Trình vòng lặp đầu vào: Được sử dụng để đọc các phần tử trong vùng lưu trữ chỉ một lần, theo chiều thuận. Chúng không thể sửa đổi các phần tử. Ví dụ:
std::vector<int> nums = {1, 2, 3, 4};
std::istream_iterator<int> input(std::cin);
std::copy(input, std::istream_iterator<int>(), std::back_inserter(nums));
  • Trình vòng lặp đầu ra: Được sử dụng để ghi các phần tử trong vùng lưu trữ chỉ một lần, theo chiều thuận. Chúng không thể viết lại các phần tử. Ví dụ:
std::vector<int> nums = {1, 2, 3, 4};
std::ostream_iterator<int> output(std::cout, ", ");
std::copy(nums.begin(), nums.end(), output);
  • Trình vòng lặp chuyển tiếp: Tương tự như trình vòng lặp đầu vào nhưng có thể được sử dụng cho nhiều lần chuyển qua các phần tử trong một bộ lưu trữ. Chúng không thể chuyển dịch lùi. Ví dụ:
std::forward_list<int> nums = {1, 2, 3, 4};
std::forward_list<int>::iterator itr = nums.begin();
while (itr != nums.end()) {
    std::cout << *itr << " ";
    ++itr;
}
  • Trình vòng lặp hai chiều: Các trình vòng lặp này cung cấp khả năng di chuyển tiến và lùi trong một vùng lưu trữ. Danh sách và bộ lưu trữ đều có trình vòng lặp hai chiều. Ví dụ:
std::list<int> nums = {1, 2, 3, 4};
std::list<int>::reverse_iterator itr = nums.rbegin();
while (itr != nums.rend()) {
    std::cout << *itr << " ";
    ++itr;
}
  • Trình vòng lặp truy cập ngẫu nhiên: Các trình vòng lặp này cung cấp các cách linh hoạt nhất để truy cập các phần tử trong vùng lưu trữ. Chúng có thể di chuyển tiến, lùi, hoặc nhảy trực tiếp đến các phần tử khác và truy cập các phần tử tại một chỉ mục nhất định. Ví dụ:
std::list<int> nums = {1, 2, 3, 4};
std::list<int>::iterator itr;
for (itr = nums.begin(); itr != nums.end(); ++itr) {
    std::cout << *itr << " ";
}
for (--itr; itr != nums.begin(); --itr) {
    std::cout << *itr << " ";
}
  • Trình vòng lặp truy cập ngẫu nhiên: Các trình vòng lặp này cung cấp những cách linh hoạt nhất để truy cập các phần tử trong vùng chứa. Chúng có thể di chuyển tiến, lùi, nhảy trực tiếp đến các phần tử khác và truy cập các phần tử tại một chỉ mục nhất định. Ví dụ:
std::vector<int> nums = {1, 2, 3, 4};
std::vector<int>::iterator itr;
for (itr = nums.begin(); itr != nums.end(); ++itr) {
    std::cout << *itr << " ";
}
for (itr -= 1; itr != nums.begin() - 1; --itr) {
    std::cout << *itr << " ";
}

Đối với hầu hết các trường hợp, bạn có thể bắt đầu với từ khóa auto và các phương thức vùng lưu trữ thích hợp (chẳng hạn như begin() và end()) để làm việc với các trình vòng lặp. Ví dụ:

std::vector<int> nums = {1, 2, 3, 4};
for (auto itr = nums.begin(); itr != nums.end(); ++itr) {
    std::cout << *itr << " ";
}

Khi làm việc với các thuật toán, hãy nhớ rằng Thư viện chuẩn C++ cung cấp các thuật toán khác nhau đã sử dụng các trình vòng lặp cho các tác vụ như tìm kiếm, sắp xếp và thao tác các phần tử.