STARTING
CONTROL STATEMENT
FUNCTION
ARRAY & POINTER
OOP
STL
ITERATORS
OTHER FEATURES
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Tổng quan về Iterators trong C++

Iterators cung cấp một cách tiện lợi và linh hoạt để truy cập vào các phần tử của một tập hợp dữ liệu, cho phép mình duyệt qua các phần tử của container một cách dễ dàng và hiệu quả. Trên thực tế, Iterators là một trong những thành phần quan trọng nhất của Thư viện Tiêu chuẩn C++ (STL), và chúng được sử dụng rộng rãi trong việc phát triển ứng dụng C++.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Trong bài viết này, mình sẽ đi sâu vào tìm hiểu về Iterators trong C++. Trước tiên, mình sẽ tìm hiểu về ý nghĩa và vai trò của Iterators trong ngôn ngữ lập trình này. Sau đó, sẽ tìm hiểu các loại Iterators có sẵn trong STL và cách chúng được sử dụng. Cuối cùng, mình sẽ thảo luận về cách sử dụng Iterators trong các ví dụ minh họa cụ thể, giúp bạn hiểu rõ hơn về cách chúng hoạt động và ứng dụng trong thực tế.

Với sự hiểu biết về Iterators, bạn sẽ có thêm một công cụ mạnh mẽ trong tay để xử lý và thao tác với dữ liệu trong các ứng dụng C++, giúp tăng hiệu suất và linh hoạt trong việc lập trình. Hãy cùng tìm hiểu chi tiết về Iterators trong tiếp theo!

Screenshot 202024 03 28 20113559 png

Iterators trong C++ là gì?

  • Iterators trong C++ là một khái niệm cho phép lặp qua các phần tử trong một cấu trúc dữ liệu như vector, list, set, map và nhiều cấu trúc dữ liệu khác.
  • Iterators cung cấp một cách tiện lợi và linh hoạt để truy cập vào các phần tử của một tập hợp dữ liệu mà không cần biết chi tiết về cách tập hợp dữ liệu được cài đặt.
  • Iterators cũng cho phép thực hiện các thao tác như thêm, xóa, sắp xếp và duyệt qua các phần tử của một tập hợp dữ liệu.

Ý nghĩa của Iterators trong lập trình C++:

  • Iterators giúp tách rời việc truy cập vào dữ liệu từ việc lưu trữ dữ liệu, làm cho code trở nên linh hoạt hơn và dễ bảo trì.
  • Chúng là một phần quan trọng của Thư viện Tiêu chuẩn C++ (STL) và được sử dụng rộng rãi trong việc thực hiện các thuật toán và cấu trúc dữ liệu.
  • Iterators cho phép mình thực hiện các hoạt động lặp lại (looping) qua các phần tử của một container, từ đó thực hiện các thao tác như tìm kiếm, sắp xếp, xóa, thêm và truy cập các phần tử một cách dễ dàng và hiệu quả.

Ví dụ: Trong một vector, ta có thể sử dụng iterators để lặp qua từng phần tử và thực hiện các thao tác như in ra các phần tử, tính tổng các phần tử, hoặc thậm chí thay đổi giá trị của các phần tử đó. Dưới đây là một ví dụ minh họa:

Bài viết này được đăng tại [free tuts .net]

#include <iostream>
#include <vector>

int main() {
    // Khởi tạo một vector
    std::vector<int> vec = {1, 2, 3, 4, 5};
    //Bài đăng tại freetuts.net

    // Sử dụng iterators để lặp qua vector và in ra các phần tử
    std::cout << "Cac phan tu trong vector: ";
    for (auto it = vec.begin(); it != vec.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

Output:

Cac phan tu trong vector: 1 2 3 4 5 

Trong ví dụ này, mình sử dụng iterators để lặp qua từng phần tử của vector vec và in ra các phần tử đó.

Loại Iterators trong C++

Input Iterators

  • Input Iterators là loại iterators chỉ cho phép đọc dữ liệu từ một sequence và chỉ có thể di chuyển theo hướng từ trái qua phải.
  • Chúng thường được sử dụng trong các hoạt động đọc dữ liệu từ các container như vector, list, set, và map.

Ví dụ:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    //Bài đăng tại freetuts.net

    // Sử dụng input iterator để đọc dữ liệu từ vector
    std::vector<int>::const_iterator it = vec.begin();
    while (it != vec.end()) {
        std::cout << *it << " ";
        ++it;
    }
    std::cout << std::endl;

    return 0;
}

Output:

1 2 3 4 5 

Output Iterators

  • Output Iterators là loại iterators cho phép ghi dữ liệu vào một sequence và chỉ có thể di chuyển theo hướng từ trái qua phải.
  • Chúng thường được sử dụng trong các hoạt động ghi dữ liệu vào các container như vector, list, set, và map.

Ví dụ:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec;
    //Bài đăng tại freetuts.net

    // Sử dụng output iterator để ghi dữ liệu vào vector
    std::ostream_iterator<int> outputIterator(std::cout, " ");
    *outputIterator = 1;
    ++outputIterator;
    *outputIterator = 2;

    return 0;
}

Forward Iterators

  • Forward Iterators là loại iterators cho phép di chuyển qua các phần tử trong một sequence một cách tuần tự và chỉ có thể di chuyển theo hướng từ trái qua phải.
  • Chúng có khả năng duyệt qua một chuỗi dữ liệu một cách tuần tự mà không cần phải quay lại phần tử trước đó.
  • Forward Iterators được sử dụng trong các container như list và forward_list.

Ví dụ:

#include <iostream>
#include <forward_list>

int main() {
    std::forward_list<int> forwardList = {1, 2, 3, 4, 5};
    //Bài đăng tại freetuts.net

    // Sử dụng forward iterator để duyệt qua các phần tử trong forward_list
    std::forward_list<int>::iterator it = forwardList.begin();
    while (it != forwardList.end()) {
        std::cout << *it << " ";
        ++it;
    }
    std::cout << std::endl;

    return 0;
}

Output:

1 2 3 4 5 

Bidirectional Iterators

  • Bidirectional Iterators là loại iterators cho phép di chuyển qua các phần tử trong một sequence theo cả hai hướng: từ trái qua phải và từ phải qua trái.
  • Chúng có khả năng duyệt qua một chuỗi dữ liệu cả từ đầu đến cuối và từ cuối về đầu mà không cần phải quay lại phần tử trước đó.
  • Bidirectional Iterators được sử dụng trong các container như list.

Ví dụ:

#include <iostream>
#include <list>

int main() {
    std::list<int> myList = {1, 2, 3, 4, 5};

    // Sử dụng bidirectional iterator để duyệt qua các phần tử trong list
    std::list<int>::iterator it = myList.begin();
    while (it != myList.end()) {
        std::cout << *it << " ";
        ++it;
    }
    std::cout << std::endl;
    //Bài đăng tại freetuts.net

    // Duyệt ngược lại từ cuối list về đầu list
    std::list<int>::reverse_iterator rit = myList.rbegin();
    while (rit != myList.rend()) {
        std::cout << *rit << " ";
        ++rit;
    }
    std::cout << std::endl;

    return 0;
}

Output:

1 2 3 4 5 
5 4 3 2 1 

Random Access Iterators

  • Random Access Iterators là loại iterators cho phép di chuyển qua các phần tử trong một sequence theo bước cố định và có khả năng truy cập trực tiếp vào các phần tử của container.
  • Chúng hỗ trợ toàn bộ các phép toán số học như cộng, trừ, nhân, chia để di chuyển iterator và truy cập các phần tử trong một khoảng cách cố định.
  • Random Access Iterators được sử dụng trong các container như vector, deque và array.

Ví dụ:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> myVector = {1, 2, 3, 4, 5};

    // Sử dụng random access iterator để truy cập các phần tử của vector
    std::vector<int>::iterator it = myVector.begin();
    std::cout << "Element at index 2: " << *(it + 2) << std::endl; // Truy cập phần tử thứ 3
    std::cout << "Element at index 4: " << *(it + 4) << std::endl; // Truy cập phần tử thứ 5
     //Bài đăng tại freetuts.net

    return 0;
}

Output:

Element at index 2: 3
Element at index 4: 5

Đối với Random Access Iterators, bạn có thể sử dụng các phép toán như +, -, ++, --, +=, -=, [] để di chuyển iterator và truy cập các phần tử trong một khoảng cách cố định.

Cách sử dụng Iterators trong C++

Duyệt qua các phần tử của một container

  • Sử dụng iterators để duyệt qua các phần tử của một container là một trong những ứng dụng quan trọng nhất của chúng.
  • Bằng cách sử dụng vòng lặp for, while hoặc các hàm Algorithm trong STL như std::for_each, bạn có thể truy cập từng phần tử của container bằng iterators.

Ví dụ:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> myVector = {1, 2, 3, 4, 5};
    //Bài đăng tại freetuts.net

    // Duyệt qua vector và in ra các phần tử
    std::cout << "Duyệt qua các phần tử của vector:" << std::endl;
    for (auto it = myVector.begin(); it != myVector.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

Output:

Duyệt qua các phần tử của vector:
1 2 3 4 5 

Sử dụng Iterators trong các hàm Algorithm của STL

  • STL cung cấp một loạt các hàm Algorithm như std::find, std::sort, std::count_if,... mà bạn có thể sử dụng iterators để thực hiện các thao tác trên container một cách linh hoạt và hiệu quả.
  • Bằng cách truyền iterators như là các tham số cho các hàm Algorithm này, bạn có thể thực hiện tìm kiếm, sắp xếp, đếm, và các thao tác khác trên các phần tử của container.

Ví dụ:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> myVector = {1, 2, 3, 4, 5};

    // Sử dụng std::find để tìm kiếm một phần tử trong vector
    auto it = std::find(myVector.begin(), myVector.end(), 3);
    if (it != myVector.end()) {
        std::cout << "Phần tử 3 được tìm thấy tại vị trí " << std::distance(myVector.begin(), it) << std::endl;
    } else {
        std::cout << "Không tìm thấy phần tử 3 trong vector" << std::endl;
    }
    //Bài đăng tại freetuts.net

    return 0;
}

Output:

Phần tử 3 được tìm thấy tại vị trí 2

Sử dụng Iterators trong các hàm của các container trong STL

  • Các hàm của các container trong STL như insert, erase, emplace, resize,... thường chấp nhận iterators làm tham số để xác định vị trí của các phần tử trong container.
  • Bằng cách sử dụng iterators, bạn có thể chèn, xóa, điều chỉnh kích thước, và thực hiện các thao tác khác trên các phần tử của container một cách linh hoạt.

Ví dụ:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> myVector = {1, 2, 3, 4, 5};

    // Chèn một phần tử vào vector bằng iterators
    auto it = myVector.begin() + 2;
    myVector.insert(it, 10);
    //Bài đăng tại freetuts.net

    // Xóa phần tử thứ 3 khỏi vector
    myVector.erase(myVector.begin() + 2);

    // In ra các phần tử của vector sau khi thực hiện các thao tác
    for (auto element : myVector) {
        std::cout << element << " ";
    }
    std::cout << std::endl;

    return 0;
}

Output:

1 2 3 4 5 

Ví dụ thực hành Iterators trong C++

Duyệt qua các phần tử của một vector bằng Iterators

#include <iostream>
#include <vector>

int main() {
    std::vector<int> myVector = {1, 2, 3, 4, 5};

    // Duyệt qua vector và in ra các phần tử
    std::cout << "Duyệt qua các phần tử của vector:" << std::endl;
    for (auto it = myVector.begin(); it != myVector.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;
    //Bài đăng tại freetuts.net

    return 0;
}

Output:

Duyệt qua các phần tử của vector:
1 2 3 4 5 

Sử dụng Iterators trong hàm sort() của STL

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> myVector = {5, 2, 9, 3, 7};

    // Sắp xếp vector sử dụng hàm sort()
    std::sort(myVector.begin(), myVector.end());
    //Bài đăng tại freetuts.net

    // In ra các phần tử của vector sau khi sắp xếp
    std::cout << "Vector sau khi sắp xếp: ";
    for (auto element : myVector) {
        std::cout << element << " ";
    }
    std::cout << std::endl;

    return 0;
}

Output:

Vector sau khi sắp xếp: 2 3 5 7 9 

Sử dụng Iterators để sao chép dữ liệu từ một container sang container khác

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> source = {1, 2, 3, 4, 5};
    std::vector<int> destination;
    //Bài đăng tại freetuts.net

    // Sao chép dữ liệu từ vector source sang vector destination
    std::copy(source.begin(), source.end(), std::back_inserter(destination));

    // In ra các phần tử của vector destination sau khi sao chép
    std::cout << "Vector destination sau khi sao chép: ";
    for (auto element : destination) {
        std::cout << element << " ";
    }
    std::cout << std::endl;

    return 0;
}

Output:

Vector destination sau khi sao chép: 1 2 3 4 5 

Kết bài

Trong bài viết này, mình đã tìm hiểu về Iterators trong ngôn ngữ lập trình C++ và vai trò quan trọng của chúng trong STL. Mình đã tìm hiểu các loại Iterators cơ bản như Input, Output, Forward, Bidirectional, và Random Access Iterators, cũng như cách sử dụng chúng trong việc duyệt qua các phần tử của container, thực hiện các thao tác sắp xếp, tìm kiếm, xóa và sao chép dữ liệu.

Việc hiểu và sử dụng Iterators giúp tăng tính linh hoạt và hiệu suất của mã lập trình C++, giúp cho việc xử lý dữ liệu trở nên dễ dàng và hiệu quả hơn. Hy vọng rằng bài viết này đã cung cấp cho bạn cái nhìn tổng quan và kiến thức cơ bản để bắt đầu làm quen với Iterators trong C++.

Cùng chuyên mục:

Các hàm xử lý ngày tháng (datetime.h) trong C/C++

Các hàm xử lý ngày tháng (datetime.h) trong C/C++

Các hàm xử lý số thực (float.h) trong C/C++

Các hàm xử lý số thực (float.h) trong C/C++

Các hàm xử lý số nguyên lớn (bigint.h) trong C/C++

Các hàm xử lý số nguyên lớn (bigint.h) trong C/C++

Các hàm xử lý thời gian (time.h) trong C

Các hàm xử lý thời gian (time.h) trong C

Các hàm xử lý chuỗi (string.h) trong C/C++

Các hàm xử lý chuỗi (string.h) trong C/C++

Thread Pools và Parallel Algorithms trong C++

Thread Pools và Parallel Algorithms trong C++

Tạo và quản lý các Multithreading trong C++

Tạo và quản lý các Multithreading trong C++

Xử lý ngoại lệ khi làm việc với Memory Allocation trong C++

Xử lý ngoại lệ khi làm việc với Memory Allocation trong C++

Try, Catch, và Throw của Exception Handling trong C++

Try, Catch, và Throw của Exception Handling trong C++

Cách sử dụng Lambda Expressions trong C++

Cách sử dụng Lambda Expressions trong C++

Sử dụng weak_ptr trong C++

Sử dụng weak_ptr trong C++

Sử dụng shared_ptr trong C++

Sử dụng shared_ptr trong C++

Sử dụng unique_ptr trong C++

Sử dụng unique_ptr trong C++

Tổng quan về Smart Pointers trong C++

Tổng quan về Smart Pointers trong C++

Sử dụng Iterators trong STL của C++

Sử dụng Iterators trong STL của C++

[Iterator] Sử dụng Vector trong C++

[Iterator] Sử dụng Vector trong C++

[Iterator] Sử dụng trong List trong C++

[Iterator] Sử dụng trong List trong C++

[STL] Sử dụng Vector trong C++

[STL] Sử dụng Vector trong C++

[STL] Các hàm thường dùng của lớp Vector trong C++

[STL] Các hàm thường dùng của lớp Vector trong C++

[STL] Các hàm thông dụng của Map trong C++

[STL] Các hàm thông dụng của Map trong C++

Top