1. 程式人生 > 其它 >c++ 實現一個簡單迭代器

c++ 實現一個簡單迭代器

迭代器

  • 為訪問容器提供統一介面
  • 資料與演算法分離

為斐波那契數列實現一個簡單的迭代器

  • 數列實現
檔案 Fibo.h
#ifndef HEAD_FIBO
#define HEAD_FIBO

#include <vector>
#include "FiboIterator.h"

class Fibo
{
private:
    static std::vector<int> _elems;
    friend int FiboIterator::operator*(); // 友元支援

public:
    Fibo(int size);
    ~Fibo();
    typedef FiboIterator iterator;     // 巢狀型別  

    FiboIterator begin();
    FiboIterator end();
    void display();
};

#endif
檔案 Fibo.cpp
#include "Fibo.h"
#include "FiboIterator.cpp"

std::vector<int> Fibo::_elems;
Fibo::Fibo(int size)
{
    for (int i = _elems.size(); i < size; i++)
    {
        if (i < 2)
            _elems.push_back(1);
        else
            _elems.push_back(_elems[i - 1] + _elems[i - 2]);
    }
}

Fibo::~Fibo()
{
}

FiboIterator Fibo::begin()
{
    return FiboIterator(0);
}

FiboIterator Fibo::end()
{
    return FiboIterator(_elems.size());
}

void Fibo::display()
{
    for (auto &&i : _elems)
    {
        std::cout << i << "  ";
    }
    std::cout << std::endl;
}
  • 迭代器實現

    檔案 FiboIterator.h
    
    #ifndef HEAD_FIBOITERATOR
    #define HEAD_FIBOITERATOR
    
    class FiboIterator
    {
    private:
        int _index;
    
    public:
        FiboIterator(int);
        ~FiboIterator();
    
        bool operator==(const FiboIterator &rhs);
        bool operator!=(const FiboIterator &rhs);
        int operator*();
        FiboIterator &operator++();
        FiboIterator operator++(int);
    };
    
    #endif
    
    檔案 FiboIterator.cpp
    
    #include "FiboIterator.h"
    
    class Fibo;
    FiboIterator::FiboIterator(int index) : _index(index - 1)
    {
    }
    
    FiboIterator::~FiboIterator()
    {
    }
    
    bool FiboIterator::operator==(const FiboIterator &rhs)
    {
        return (rhs._index == this->_index);
    }
    
    bool FiboIterator::operator!=(const FiboIterator &rhs)
    {
        return (rhs._index != this->_index);
    }
    int FiboIterator::operator*()
    {
        return Fibo::_elems[_index + 1];
    }
    
    FiboIterator &FiboIterator::operator++()
    {
        _index++;
        return *this;
    }
    
    FiboIterator FiboIterator::operator++(int)
    {
        FiboIterator temp = *this;
        _index++;
        return temp;
    }
    
    測試 main.cpp
    
    #include "Fibo.h"
    #include "Fibo.cpp"
    
    int main()
    {
        Fibo fb(5);
        fb.display();
    
        for (Fibo::iterator it = fb.begin(); it != fb.end(); it++)
        {
            std::cout << "fb:" << *it << std::endl;
        }
    }
    

    == end