题目要求

费手实验{tabs}

Warning

自定义Vector类, 实现以下操作:
(1)基于动态存储分配自定义一个整数向量类Vector,实现构造函数(至少两个,包括一个无参),拷贝构造函数和析构函数;并实现一些常见功能,比如:insert, erase, push_back, pop_back, clear, size等等。要求存储空间可自动增长,动态增长策略合理(比如,每次容量不够时原容量加倍)。
(2)在主程序中,对定义的Vector进行充分测试(以下仅供参考,主函数可以自己设计):
定义一个Vector对象a, push_back若干数据 到a中(一边push_back,一边打印size和capacity的值观察其变化);输出所有数据;输出第一个元素,输出最后一个元素,删除数组首尾的两个数据,删除一个特定位置的数据,并输出当前a所有数据;输入一个数据,添加到末尾,输入一个数据,插入到数组头部;输入一个数据,插入到中间某位置;输出目前向量a中的所有数据。

定义一个Vecotor对象b, 初始化为包含5个值为7的元素,输出b所有数据,输出有效元素个数及容量;在b后面添加6个数据,输出有效元素个数及容量,观察其变化;由对象b拷贝构造出对象c,修改b的某个数据的值,修改c的某个数据的值,输出b,c所有元素的值, 观察是否符合操作语义。

源码

#include <iostream>
using namespace std;
class Vector{
    int cap; //最大容量
    int sz;  //已有个数
    int* buf; //指针
    
    public:
        Vector(){
            sz = 0; cap = 4;buf = new int[4];
        }
        Vector(int n,int num);
        Vector(const Vector &a);
        ~Vector(){
            delete[] buf;
        }
        int& operator[] (int i){
            if (i > sz) exit(1);
            return buf[i];
        }
        //其他成员函数实现一些常见功能,比如:insert, erase, push_back, pop_back, clear, size等等。要求存储空间可自动增长,动态增长策略合理(比如,每次容量不够时原容量加倍)。
        void push_back(int x);
        void pop_back();
        void insert(int i ,int val);
        void erase(int i);
        void clear();
        int size();
        void print(){
            printf("size: %d, capacity: %d \n",sz,cap);
        }
        void printall(){
            cout << "{";
            for(int i = 0;i<sz;i++){
                if(i!=sz-1) cout << buf[i] << ",";
                else {
                    cout << buf[i];
                    cout << "}";
                }
            }
            cout<<endl;
        }
};
Vector::Vector(int n,int num){
    for(int i = 1;i<=n;i++){
        if(sz >= cap){
            if(cap == 0) cap =2;
            int *buf2 = new int[cap*=2]; //扩容
            memcpy(buf2,buf,sz*sizeof(int));
            buf2[sz] = num;
            delete[] buf;
            buf = buf2;
        }
        else{
            buf[sz] = num;
            }
        sz++;
    }
}
Vector::Vector(const Vector &a){
    cap = sz = a.sz;
    buf = new int[sz];
    memcpy(buf,a.buf,sz*sizeof(int));
}
void Vector::insert (int i ,int val){
    if(i > sz || i<0) return;
    if(sz >= cap){
        cap *=2;
        int *buf2 = new int[cap]; //扩容
        memcpy(buf2,buf,i*sizeof(int));
        buf2[i] = val;
        memcpy(buf2+i+1,buf+i,(sz-i)*sizeof(int));
        delete[] buf;
        buf = buf2;
    }
    else{
        int *buf2 = new int[cap];
        memcpy(buf2,buf,i*sizeof(int));
        buf2[i] = val;
        memcpy(buf2+i+1,buf+i,(sz-i)*sizeof(int));
        delete[] buf;
        buf = buf2;
    }
    sz++;
}
void Vector::push_back(int x){
    if(sz >= cap){
        if(cap == 0) cap =2;
        int *buf2 = new int[cap*=2]; //扩容
        memcpy(buf2,buf,sz*sizeof(int));
        buf2[sz] = x;
        delete[] buf;
        buf = buf2;
    }
    else{
        buf[sz] = x;
    }
    sz++;
}
void Vector::pop_back(){
    sz--;
    if(sz < cap / 4 && cap >= 4*2){
        cap /= 2;
        int *buf2 = new int[cap];
        for(int i = 0 ;i < sz;i++){
            buf2[i] = buf[i];
        }
        delete[] buf;
        buf = buf2;
    }
    else{
        int *buf2 = new int[cap];
        for(int i = 0 ;i < sz;i++){
            buf2[i] = buf[i];
        }
        delete[] buf;
        buf = buf2;
    }
}
void Vector::erase(int i){
    if(i > sz || i<0) return;
    for(int j = i;j < sz-1;j++){
        buf[j] = buf[j+1];
    }
    sz--;
    if(sz < cap / 4 && cap >= 4*2){
        cap /= 2;
        int *buf2 = new int[cap];
        memcpy(buf2,buf,i*sizeof(int));
        delete[] buf;
        buf = buf2;
    }
}
void Vector::clear(){
    sz = 0;
    if(cap >= 4*2){
        cap =4;
    }
    int* buf2 = new int[cap];
    delete[] buf;
    buf = buf2;
}
int Vector::size(){
    return sz;
}

int main(){
    int x = 0;
    Vector a;
    printf("%s\n","Push number 1");
    a.push_back(1);
    a.print();
    printf("%s\n","Push number 2");
    a.push_back(2);
    a.print();
    printf("%s\n","Push number 3");
    a.push_back(3);
    a.print();
    printf("%s\n","Push number 5");
    a.push_back(5);
    a.print();
    printf("%s\n","Push number 7");
    a.push_back(7);
    a.print();
    a.printall();
    cin >> x;
    a.push_back(x);
    a.printall();
    cin >>x;
    a.insert(0,x);
    a.printall();
    cin >> x;
    a.insert(4,x);
    a.printall();
    printf("%s\n","a -> pop_back:");
    a.pop_back();
    a.printall();
    a.clear();
    printf("%s\n","a -> clear:");
    a.print();
    
    cout << endl <<endl;
    printf("%s\n","Test 2:");
    Vector b(7,7);
    b.print();
    for(int i = 1;i<=7;i++){
        b.push_back(i);
        b.print();
    }
    cout << "size:" << b.size() <<endl;
    Vector c(b);
    c.insert(5,100);
    b.insert(5,100);
    b.printall();
    c.printall();
}