close up photo of programming of codes

codecungnhau.com

Một trang web về kỹ thuật lập trình

C++ Design Patterns: Iterator

Iterator là một mẫu thiết kế hành vi cho phép duyệt tuần tự thông qua một cấu trúc dữ liệu phức tạp mà không để lộ các chi tiết bên trong của nó.

Nhờ có Iterator, client có thể xem qua các phần tử của các tập hợp khác nhau theo cách tương tự bằng cách sử dụng một giao diện trình lặp duy nhất.

Cách sử dụng mẫu

Sử dụng: Mẫu rất phổ biến trong mã C++. Nhiều framework và thư viện sử dụng nó để cung cấp một cách chuẩn để duyệt qua các tập hợp của chúng.

Nhận dạng: Iterator dễ dàng nhận ra bằng các phương thức điều hướng (chẳng hạn như next, previous và các phương thức khác). Mã client sử dụng trình lặp có thể không có quyền truy cập trực tiếp vào tập hợp đang được duyệt.

Chương trình mẫu

main.cpp

#include <iostream>
#include <string>
#include <vector>
/**
 * C++ có triển khai Iterator riêng của nó hoạt động với các tập hơp 
 * phổ biến khác nhau được xác định bởi thư viện chuẩn.
 */
template <typename T, typename U>
class Iterator
{
public:
    typedef typename std::vector<T>::iterator iter_type;
    Iterator(U *p_data, bool reverse = false) : m_p_data_(p_data)
    {
        m_it_ = m_p_data_->m_data_.begin();
    }
    void First()
    {
        m_it_ = m_p_data_->m_data_.begin();
    }
    void Next()
    {
        m_it_++;
    }
    bool IsDone()
    {
        return (m_it_ == m_p_data_->m_data_.end());
    }
    iter_type Current()
    {
        return m_it_;
    }
private:
    U *m_p_data_;
    iter_type m_it_;
};
/**
 * Tập hợp cung cấp một hoặc một số phương thức để truy xuất 
 * các thể hiện trình lặp mới, tương thích với lớp tập hợp.
 */
template <class T>
class Container
{
    friend class Iterator<T, Container>;
public:
    void Add(T a)
    {
        m_data_.push_back(a);
    }
    Iterator<T, Container> *CreateIterator()
    {
        return new Iterator<T, Container>(this);
    }
private:
    std::vector<T> m_data_;
};
class Data
{
public:
    Data(int a = 0) : m_data_(a) {}
    void set_data(int a)
    {
        m_data_ = a;
    }
    int data()
    {
        return m_data_;
    }
private:
    int m_data_;
};
/**
 * Mã client có thể biết hoặc không biết về các lớp trình lặp hoặc tập hợp cụ thể,
 * đối với việc triển khai này, tập hợp là chung để bạn có thể sử dụng với int 
 * hoặc với lớp tùy chỉnh.
 */
void ClientCode()
{
    std::cout << "________________Iterator with int______________________________________" << std::endl;
    Container<int> cont;
    for (int i = 0; i < 10; i++)
    {
        cont.Add(i);
    }
    Iterator<int, Container<int>> *it = cont.CreateIterator();
    for (it->First(); !it->IsDone(); it->Next())
    {
        std::cout << *it->Current() << std::endl;
    }
    Container<Data> cont2;
    Data a(100), b(1000), c(10000);
    cont2.Add(a);
    cont2.Add(b);
    cont2.Add(c);
    std::cout << "________________Iterator with custom Class______________________________" << std::endl;
    Iterator<Data, Container<Data>> *it2 = cont2.CreateIterator();
    for (it2->First(); !it2->IsDone(); it2->Next())
    {
        std::cout << it2->Current()->data() << std::endl;
    }
    delete it;
    delete it2;
}
int main()
{
    ClientCode();
    return 0;
}

Kết quả

________________Iterator with int______________________________________
0
1
2
3
4
5
6
7
8
9
________________Iterator with custom Class______________________________
100
1000
10000

Đã đăng vào

trong

,

bởi

Bình luận

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *