5月15号C++中vrctors练习

文章介绍了如何实现一个名为Myvector的模板类,该类类似于标准库中的std::vector,包括构造函数、析构函数、拷贝构造及赋值运算符、以及at()、empty()、full()、front()、back()、size()、clear()、expand()、push_back()和pop_back()等成员函数,涉及动态内存管理和容器的基本操作。

作业要求:

template <typename T>
class Myvector
{
        private:
        T * first;
        T * last;
        T end;
};

要实现的函数: 构造函数  析构函数  拷贝构造 拷贝赋值
at()  、empty()
full()、 front()、back()、size()、clear()、expand()二倍扩容函数、push_back()、pop_back()

template <typename T>
class Myvector
{
public:
    //构造函数
     Myvector() : frist(nullptr), last(nullptr), end(nullptr) {}
    Myvector(int n): frist(new T[n]),last(nullptr),end(frist+n){}
    //拷贝构造
    Myvector(const Myvector &other)
    {
        int n = other.size();
        frist = new T[n];
        last  = frist+n;
        end   = frist+n;
        for(int i=0;i<n;i++)
        {
            frist[i]=other.frist[i];
        }
    }
    //拷贝赋值函数
    Myvector& operator=(const Myvector &other)
    {
        if (this != &other)
        {
            delete[] frist;
            int n = other.size();
            this->frist = new T[n];
            this->last = frist + n;
            this->end = frist + n;
            for (int i = 0; i < n; i++)
            {
                frist[i] = other.frist[i];
            }
        }
        return *this;
    }
    //析构函数
    ~Myvector()
    {
        delete [] frist;
        frist = nullptr;
        last  = nullptr;
        end   = nullptr;
    }
    //at()
    T &at(int sub)
    {
        if(sub<0 || sub>=last-frist)
        {
            cout<<"访问超出范围"<<endl;
        }
        return frist[sub];
    }
    //empty()
    bool empty() const{return last == frist;}
    //full()
    bool full() const {return last == end;}
    //front()
    T& front() {return *frist;}
    //back()
    T& back()  {return *(last-1);}
    //size()
    int size() const {return last - frist;}
    //clear()
    void clear() {last = frist;}
    //expand()
    void expand(int n)
    {
        int m =size();
        T* newfrist = new T[m+n];
        for(int i=0;i<m;i++)
        {
            newfrist[i]=frist[i];
        }
        delete []frist;
        frist = newfrist;
        last =  newfrist+m;
        end  =  newfrist+m+n;
    }
    //push_back
    void push_back(const T& value)
    {
        if(full())
        {
            expand(size());
        }
        *last++=value;
    }
    //pop_back
    void pop_back()
    {
        if(!empty())
        {
            --last;
        }
    }
private:
    T *frist;
    T *last;
    T *end;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值