C++(day7)

 

#include <iostream>
 
using namespace std;
 
template <typename T>
class My_vector
{
private:
    T * first;      //指向第一个元素
    T * last;       //指向最后一个元素
    T * end;        //指向容器末尾
public:
    //构造函数
    My_vector()
    {
        first = last = end = nullptr;
    }
    My_vector(int size = 8)     //默认初始大小为8
    {
        first = new T[size];    //堆区申请空间
        last = first;           //初始为空
        end = first + size;     //容器末尾指针
    }
 
    //析构函数
    ~My_vector()
    {
        delete []first;                     //释放堆区空间
        first = last = end = nullptr;       //指针指向空
    }
 
    //拷贝构造
    My_vector(const My_vector &other)
    {
        int size = other.end - other.first;                     //原始容器大小
        this->first = new T[size];                              //创建新容器
        this->end = this->first + size;                         //定位新end指针
        this->last = this->first + (other.last - other.first);  //定位新last指针
    }
 
    //拷贝赋值
    My_vector &operator=(const My_vector &other)
    {
        delete []this->first;                                   //删除原始空间
        int size = other.end - other.first;                     //原始容器大小
        this->first = new T[size];                              //创建新容器
        this->end = this->first + size;                         //定位新end指针
        this->last = this->first + (other.last - other.first);  //定位新last指针
 
        return *this;
    }
 
    //按位查找
    T at(int n)
    {
        return this->first[n];
    }
 
    //判空函数
    bool empty()
    {
        return this->first == this->last;
    }
 
    //判满函数
    bool full()
    {
        return this->last == this->end;
    }
 
    //获取第一个元素
    T &front()
    {
        return *first;
    }
 
    //获取最后一个元素
    T &back()
    {
        return *(last-1);
    }
 
    //获取数据长度
    int size()
    {
        return last-first;
    }
 
    //清空元素,容量不变
    void clear()
    {
        last = first;
    }
 
    //二倍扩容
    void expand()
    {
        int size = this->end - this->first;     //获取容量
 
        T *temp = new T[2*size];        //两倍容量的空间
 
        memcpy(temp, this->first, size*sizeof (T));     //原始数据拷贝
 
        delete []first;     //释放原空间
 
        first = temp;      //指针指向新空间
        last = first + size;
        end = first + 2*size;
    }
 
    //实现尾插
        void push_back( const T val)
        {
            if(this->full())
            {
                this->expand();        //满了进行扩容
            }
 
            *last = val;
            last++;
        }
 
        //实现尾删
        void pop_back()
        {
            if(this->empty())
            {
                return;
            }
 
            --last;
        }
};
 
int main()
{
    My_vector<int> v1(12);              //调用无参构造,数据元素类型为int类型
 
 
    //判断当前数组是否为空
    if(v1.empty())
    {
        cout<<"v1 is empty"<<endl;
    }else
    {
        cout<<"v1 is not empty"<<endl;
    }
 
 
    //输出当前的数组容器的大小
    cout<<"v1.size = "<<v1.size()<<endl;
 
 
    //向容器中放入数据
    for(int i=0; i<20; i++)
    {
        v1.push_back(520+i);           //向末尾放入一个值
        cout<<"v1.size = "<<v1.size()<< endl;
    }
 
 
    //遍历所有元素
    for(int i=0; i<v1.size(); i++)
    {
        cout<<v1.at(i)<<" ";
    }
    cout<<endl;
 
 
    //删除最后一个元素
    v1.pop_back();
    for(int i=0; i<v1.size(); i++)
    {
        cout<<v1.at(i)<<" ";
    }
    cout<<endl;
 
 
    //第一个元素和最后一个元素
    v1.front() = 0;
    v1.back() = 99999;
    for(int i=0; i<v1.size(); i++)
    {
        cout<<v1.at(i)<<" ";
    }
    cout<<endl;
 
 
    //清空容器
    v1.clear();
    cout<<"v1.size = "<<v1.size()<<endl;
 
 
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值