C++模板类实现Vector

来源:互联网 发布:硅胶点胶机编程视频 编辑:程序博客网 时间:2024/05/21 23:33

定义类模板(class template)

在定义的类模板中,使用模板形参作为类型或值的占位符,在使用类时再提供具体的类型或值。


代码实现:
1、

Vector<int>Vector<char>
#include<iostream>#include<assert.h>using namespace std;template<typename T>class Vector{public:    Vector()//构造        :_start(0)        , _finish(0)        , _endOfStorage(0)    {}    Vector(const T* array, size_t size);//带参构造函数声明    Vector(const Vector<T>& v)//拷贝构造    {        size_t size = v.Size();        T* temp = new T[size];        assert(temp);        for (size_t i = 0; i < size; i++)        {            temp[i] = v[i];        }        delete[] _start;        _start = temp;        _finish = _start + size;        _endOfStorage = _finish;    }    Vector& operator=(const Vector<T>& s)//赋值运算符重载    {        if (this != &s)        {            _start = new T[1];            Vector temp(s);            swap(_start, temp._start);        }        return *this;    }    ~Vector()    {        if (_start)        {            delete[] _start;            _start = _finish = _endOfStorage = 0;        }    }    void Display()    {        size_t size = Size();        for (size_t i = 0; i < size; i++)        {            cout << _start[i];        }        cout << endl;    }    ///////////////////Modify////////////////////    void PushBack(const T& data)//尾插    {        CheckCapacity();//增容函数        *_finish++ = data;    }    void PopBack()//尾删    {        --_finish;    }    void Insert(size_t pos, const T& data)//任意位置的插入    {        size_t size = Size();        assert(pos <= size && pos >= 0);        CheckCapacity();        for (size_t i = size; i > pos; i--)        {            _start[i] = _start[i - 1];        }        _start[pos] = data;        _finish++;    }    void Erase(size_t pos)//任意位置的删除    {        size_t size = Size();        assert(pos < size && pos >= 0);        for (size_t i = pos; i < size - 1; i++)        {            _start[i] = _start[i + 1];        }        _finish--;        /*if (pos = size - 1)        _finish--;*/    }    //////////////////capacity/////////////////////     size_t Size()const//顺序表元素个数    {        return _finish - _start;    }    size_t Capacity()const//顺序表容量    {        return _endOfStorage - _start;    }    bool Empty()const//判空    {        return _start == _finish;    }    void Resize(size_t newSize, const T& data = T())//元素个数改变到newSize    {        size_t oldsize = Size();        size_t capacity = Capacity();        if (newSize <= oldsize)        {            _finish = _start + newSize;        }        else if (oldsize < newSize&&newSize <= capacity)        {            //*(_finish++) = data;            for (size_t i = oldsize; i < newSize; i++)            {                _start[i] = data;            }            _finish = _start + newSize;        }        else        {            T* temp = new T[newSize];            for (size_t i = 0; i < oldsize; i++)                temp[i] = _start[i];            for (size_t i = oldsize; i < newSize; i++)                temp[i] = data;            delete[] _start;            _start = temp;            _finish = _start + newSize;            _endOfStorage = _start + newSize;        }    }    //////////////////Acess  元素访问/////////////////     T& operator[](size_t index)//下标运算符重载    {        assert(index < Size());        return _start[index];    }    const T& operator[](size_t index)const    {        assert(index < Size());        return _start[index];    }    T& Front()//返回值可以作为左值,返回引用    {        return _start[0];    }    const T& Front()const    {        return _start[0];    }    T& Back()//返回最后一个元素    {        //return _start[Size() - 1];        return *(_finish - 1);    }    const T& Back()const    {        //return _start[Size() - 1];        return *(_finish - 1);    }    void Clear()//清空顺序表    {        _finish = _start;    }    template <class T>    friend ostream& operator<<(ostream& _cout, const Vector<T>& v)    {        for (size_t i = 0; i < v.Size(); i++)            cout << v[i] << "  ";    }private:    void CheckCapacity()    {        int sz = Capacity();        int size = Size();        if (size >= sz)        {            int capacity = sz ? (sz * 2) : 3;            //cout << capacity << endl;            T* temp = new T[capacity];            for (int i = 0; i < size; i++)            {                temp[i] = _start[i];            }            assert(temp);            delete[] _start;            _start = temp;            _finish = _start + size;            _endOfStorage = _start + capacity;        }    }private:    T* _start;    T* _finish;    T* _endOfStorage;};template <class T>Vector<T>::Vector(const T* array, size_t size): _start(new T[size]), _finish(_start), _endOfStorage(_start + size){    for (size_t i = 0; i < size; i++)        *_finish++ = array[i];}void Test1(){    int p1[] = { 1, 2, 3, 4, 5, 6 };    Vector<int> v1(p1, 6);    cout << "v1(p1,6):" << endl;    v1.Display();    cout << "size= " << v1.Size() << endl;    cout << "capacity= " << v1.Capacity() << endl;    cout << endl;    v1.PushBack(7);    cout << "PushBack(7):" << endl;    v1.Display();    cout << "size= " << v1.Size() << endl;    cout << "capacity= " << v1.Capacity() << endl;    cout << endl;    v1.Insert(1, 2);    cout << "Insert():" << endl;    cout <<"v2[2]:"<< v1[2] << endl;    v1.Display();    cout << "size= " << v1.Size() << endl;    cout << "capacity= " << v1.Capacity() << endl;    cout << endl;    v1.Resize(10);    cout << "Resize():" << endl;    v1.Display();    cout << "size= " << v1.Size() << endl;    cout << "capacity= " << v1.Capacity() << endl;    cout << endl;    v1.Clear();    cout << "Clear():" << endl;    cout << "size= " << v1.Size() << endl;    cout << "capacity= " << v1.Capacity() << endl;}void Test2(){    char* p2 = "day day up";    Vector<char> v2(p2,10);    cout << "v2(p2,10):" << endl;    v2.Display();    cout << "size= " << v2.Size() << endl;    cout << "capacity= " << v2.Capacity() << endl;    cout << endl;    v2.PushBack(']');    cout << "PushBack(']'):" << endl;    v2.Insert(0, '[');    cout << "Insert():" << endl;    v2.Display();    cout << "size= " << v2.Size() << endl;    cout << "capacity= " << v2.Capacity() << endl;    cout << "v2[2]:" << v2[2] << endl;    cout << endl;    v2.Resize(20,'s');    cout << "Resize():" << endl;    v2.Display();    cout << "size= " << v2.Size() << endl;    cout << "capacity= " << v2.Capacity() << endl;    cout << endl;    v2.Clear();    cout << "Clear():" << endl;    cout << "size= " << v2.Size() << endl;    cout << "capacity= " << v2.Capacity() << endl;}int main(){    cout << "Vector<int>:" << endl;    Test1();    cout << endl<<endl;    cout << "Vector<char>:" << endl;    Test2();    getchar();    return 0;}


2、

Vector<String>
#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<assert.h>using namespace std;//实现Vector的以下接口:template<typename T>class Vector{public:    Vector()        :_start(0)        , _finish(0)        , _endOfStorage(0)    {}    Vector(const T* array, size_t size);    Vector(const Vector<T>& v)    {        size_t size = v.Size();        T* temp = new T[size];        assert(temp);        for (size_t i = 0; i < size; i++)        {            temp[i] = v[i];        }        delete[] _start;        _start = temp;        _finish = _start + size;        _endOfStorage = _finish;        //return *this;    }    Vector& operator=(const Vector<T>& s)    {        if (this != &s)        {            _start = new T[1];            Vector temp(s);            swap(_start, temp._start);        }        return *this;    }    ~Vector()    {        if (_start)        {            delete[] _start;            _start = _finish = _endOfStorage = 0;        }    }    void Display()    {        size_t size = Size();        for (size_t i = 0; i < size; i++)        {            cout << _start[i];        }        cout << endl;    }    ///////////////////Modify/////////////////////     void PushBack(const T& data)    {        CheckCapacity();        *_finish++ = data;    }    void PopBack()    {        --_finish;    }    void Insert(size_t pos, const T& data)    {        size_t size = Size();        assert(pos <= size && pos >= 0);        CheckCapacity();        for (size_t i = size; i > pos; i--)        {            _start[i] = _start[i - 1];        }        _start[pos] = data;        _finish++;    }    void Erase(size_t pos)    {        size_t size = Size();        assert(pos < size && pos >= 0);        for (size_t i = pos; i < size - 1; i++)        {            _start[i] = _start[i + 1];        }        _finish--;    }    //////////////////capacity/////////////////////     size_t Size()const    {        return _finish - _start;    }    size_t Capacity()const    {        return _endOfStorage - _start;    }    bool Empty()const    {        return _start == _finish;    }    void Resize(size_t newSize, const T& data = T())    {        size_t oldsize = Size();        size_t capacity = Capacity();        if (newSize <= oldsize)        {            _finish = _start + newSize;        }        else if (oldsize < newSize&&newSize <= capacity)        {            for (size_t i = oldsize; i < newSize; i++)            {                _start[i] = data;            }            _finish = _start + newSize;        }        else        {            T* temp = new T[newSize];            for (size_t i = 0; i < oldsize; i++)                temp[i] = _start[i];            for (size_t i = oldsize; i < newSize; i++)                temp[i] = data;            delete[] _start;            _start = temp;            _finish = _start + newSize;            _endOfStorage = _start + newSize;        }    }    /////////////////Acess  元素访问//////////////////     T& operator[](size_t index)    {        assert(index < Size());        return _start[index];    }    const T& operator[](size_t index)const    {        assert(index < Size());        return _start[index];    }    T& Front()//返回值可以作为左值,返回引用    {        return _start[0];    }    const T& Front()const    {        return _start[0];    }    T& Back()    {        return *(_finish - 1);    }    const T& Back()const    {        return *(_finish - 1);    }    void Clear()    {        _finish = _start;    }private:    void CheckCapacity()    {        int sz = Capacity();        int size = Size();        if (size >= sz)        {            int capacity = sz ? (sz * 2) : 3;            T* temp = new T[capacity];            for (int i = 0; i < size; i++)            {                temp[i] = _start[i];            }            assert(temp);            delete[] _start;            _start = temp;            _finish = _start + size;            _endOfStorage = _start + capacity;        }    }    //template <class T>    friend ostream& operator<<(ostream& _cout, const Vector<T>& v)    {        for (size_t i = 0; i < v.Size(); i++)            cout << v[i] << "  ";        return _cout;    }private:    T* _start;    T* _finish;    T* _endOfStorage;};template <class T>Vector<T>::Vector(const T* array, size_t size): _start(new T[size]), _finish(_start), _endOfStorage(_start + size){    for (size_t i = 0; i < size; i++)        *_finish++ = array[i];}class String{public:    String(const char* pStr = " ")    {        if (pStr == NULL)        {            _pStr = new char[1];            *_pStr = '\0';        }        else        {            _pStr = new char[strlen(pStr) + 1];            strcpy(_pStr, pStr);        }    }    String(const String& s)        :_pStr(new char[strlen(s._pStr)+1])    {        strcpy(_pStr, s._pStr);    }    String& operator=(const String& s)    {        if (this != &s)        {            char* temp = new char[strlen(s._pStr) + 1];            strcpy(temp, s._pStr);            delete[] _pStr;            _pStr = temp;        }        return *this;    }    friend ostream& operator<<(ostream& _cout, const String& v)    {            _cout << v._pStr;        return _cout;    }private:    char* _pStr;};void TestString(){    Vector<String> v;    v.PushBack("1111");    v.PushBack("2222");    v.PushBack("3333");    cout << "PushBack()" << endl;    cout << "size= " << v.Size() << endl;    cout << "capacity= " << v.Capacity() << endl;    cout << endl;    v.PushBack("4444");    v.PushBack("5555");    cout << "PushBack()" << endl;    cout << "size= " << v.Size() << endl;    cout << "capacity= " << v.Capacity() << endl;    cout << v << endl;    cout << endl;    v.Insert(1, "123");    cout << "Insert():" << endl;    cout << v << endl;    cout << endl;    cout << "v2[2]:" << v[2] << endl;    cout << endl;    v.Resize(50);    cout << "Resize():" << endl;    v.Display();    cout << "size= " << v.Size() << endl;    cout << "capacity= " << v.Capacity() << endl;    cout << endl;    v.Clear();    cout << "Clear():" << endl;    cout << "size= " << v.Size() << endl;    cout << "capacity= " << v.Capacity() << endl;    cout << endl;}int main(){    TestString();    getchar();    return 0;}