7.24 C++

封装Vector

#include 
#include 
using namespace std;

template 
class Vector
{
private:
    T *start;  //指向容器的起始地址
    T *last;   //指向容器存放数据的下一个位置
    T *end;    //指向容器的最后的下一个位置
public:
    Vector():start(new T),last(start),end(start){}         //无参构造
    Vector(T *s):start(new T(s)),last(start),end(start){}                            //有参构造
    Vector(const Vector &other)                     //拷贝构造
    {
        start=new T[other.end-other.start];
        start=other.start;
        last=other.last;
        end=other.end;
    }
    Vector &operator=(Vector other)                  //拷贝赋值
    {
        delete []start;
        this->start=other.start;
        for(int i=0;i<(other.end-other.start);i++)
        {
            start[i]=other.start[i];
        }
        return *this;
    }
    ~Vector()  //析构函数
    {
        delete start;
        start=nullptr;
        last=nullptr;
        end=nullptr;
    }

   //类内声明
    int Size();               //获取数据元素个数
    T &At(int index);         //根据下标获取数据
    bool Empty();             //判空
    bool Full();              //判满
    T &Front();               //获取第一个元素
    T &Back();                //获取最后一个元素
    void Clear();             //清空数据元素
    void Expand();            //二倍扩容
    void Push_back(T &elem);  //尾插
    void Pop_back();          //尾删
    void Output();            //循环遍历

};
//类外定义
//获取数据元素个数
template 
int Vector::Size()
{
    return last-start;
}
//根据下标获取数据
template 
T &Vector::At(int index)
{
    return *(start+index);
}
//判空
template 
bool Vector::Empty()
{
    return start==last?true:false;
}
//判满
template 
bool Vector::Full()
{
    return last==end?true:false;
}
//获取第一个元素
template 
T &Vector::Front()
{
    return *start;
}
//获取最后一个元素
template 
T &Vector::Back()
{
    return *(last-1);
}
//清空数据元素
template 
void Vector::Clear()
{
    last=start;
}
//二倍扩容
template 
void Vector::Expand()
{
    T *temp=new T[2*Size()];
    memcpy(temp,start,sizeof(T)*(end-start));
    delete []start;
    start=temp;
    last=start+Size();
    end=start+2*Size();
}
//尾插
template 
void Vector::Push_back(T &elem)
{
    *(last++)=elem;
    if(last==end)
        Expand();
}
//尾删
template 
void Vector::Pop_back()
{
    if(Empty())
        throw string("empty");
    last--;
}
//循环遍历
template 
void Vector::Output()
{
    if(Empty())
        throw string("empty");
    for(int i=0;i v1;
    char ch;
    memset(&ch,0,sizeof (ch));
    int elem=0;

    do
    {
        //尾插
        cout<<"请输入尾插元素:"<>elem;
        v1.Push_back(elem);
        cout<<"是否继续尾插?(Y/N)"<>ch;
    }while(ch=='y'||ch=='Y');
    v1.Output();
    cout<>ch;
        }while(ch=='y'||ch=='Y');

    }
    catch (string e)
    {
        if(e=="empty")
            cout<<"容器为空!"<>index;
    cout<<"这个值为:"<

思维导图

7.24 C++_第1张图片

 

你可能感兴趣的:(c++)