C++: range的实现

使用C++实现一个range, 功能如下:

int main()
{
    int cases = 0;

    cout << "#Case " << ++cases << ": range(15): \n\t";
    for(auto x : range(15)) cout << x << " ";
    cout << endl;

    cout << "#Case " << ++cases << ": range(2, 6): \n\t";
    for(auto x : range(2, 6)) cout << x << " ";
    cout << endl;

    cout << "#Case " << ++cases << ": range(2, 6, 3): \n\t";
    for(auto x : range(2, 6, 3)) cout << x << " ";
    cout << endl;

    cout << "#Case " << ++cases << ": range(10.5, 15.5): \n\t";
    for(auto x : range(10.5, 15.5)) cout << x << " ";
    cout << endl;

    cout << "#Case " << ++cases << ": range(35, 27, -1.5): \n\t";
    for(auto x : range(35, 27, -1.5)) cout << x << " ";
    cout << endl;

    cout << "#Case " << ++cases << ": range('a', 'z'): \n\t";
    for(char x : range('a', 'z')) cout << x << " ";
    cout << endl;
}

实现代码如下:

template <class T>
class Range
{
private:
    T mBegin;
    T mEnd;
    T mStep;
    int mSize;

    class Iterator
    {
    private:
        T mCurrentValue;
        Range& mRange;
        int mCurrentStep;

    public:
        Iterator(int start, Range& range) : mCurrentStep(start), mRange(range)
        {
            mCurrentValue = mRange.mBegin + mCurrentStep * mRange.mStep;
        }

        T operator * ()
        {
            return mCurrentValue;
        }

        bool operator != (const Iterator &another)
        {
            return mCurrentStep != another.mCurrentStep;
        }

        const Iterator* operator++()
        {
            mCurrentValue += mRange.mStep;
            mCurrentStep++;
            return this;
        }

    };

public:
    Range(T begin, T end, T step = 1) : mBegin(begin), mEnd(end), mStep(step)
    {
        if(step > 0 && mBegin >= mEnd)
            throw std::logic_error("end must greater than begin.");
        else if(step < 0 && mBegin <= mEnd)
            throw std::logic_error("end must less than begin.");

        mSize = (mEnd - mBegin) / mStep;

        if(mBegin + mSize * mStep != mEnd)
        {
            mSize++;
        }
    };

    Iterator begin()
    {
        return Iterator(0, *this);
    }

    Iterator end()
    {
        return Iterator(mSize, *this);
    }

};

template <typename T, typename U = int>
auto range(T begin, T end, U step = 1)->Range<decltype(begin+step)>
{
    return Range<decltype(begin+step)>(begin, end, step);
};

template <typename T>
Range<T> range(T end)
{
    return Range<T>(0, end, 1);
};

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容