向量容器vector模板

来源:互联网 发布:淘宝分销和代销的区别 编辑:程序博客网 时间:2024/06/12 01:13

参考C++ vector类模板,设计实现自己的CVector向量类模板,完成下列基本功能: 构造、析构、size、push_back和下标访问,在通过下标访问越界时抛出异常。编写测试程序,利用该类模板完成一个解释器,它接受命令,执行相应操作。

#include #include using namespace std;#define SIZE 10template class CVector {private:    T *m_data;      //数据    int m_size;     //向量长度    int capacity;   //向量容器初始大小public:    CVector() {        capacity = SIZE;        m_data = new T[capacity];        m_size = 0;    }//无参构造函数,向量容器为初始长度    CVector(int n) : m_size(n), capacity(n) {        m_data = new T[capacity];    }//有参构造函数,参数为向量容器的长度    CVector(int n, T x) : m_size(n), capacity(n) {        capacity = SIZE;        m_data = new T[capacity];        for (int i = 0; i < m_size; i++)            m_data[i] = x;    }//有参构造函数,参数为换成那个度与初始化内容    CVector(const CVector &v) {        m_size = v.m_size;        capacity = v.capacity;        m_data = new T[capacity];        for (int i = 0; i < m_size; i++)            m_data[i] = v.m_data[i];    }//拷贝构造函数    ~CVector() {        delete[]m_data;        m_size = 0;        capacity = 0;    }//析构函数    int size() const {        return m_size;    }//返回向量容器的长度    void resize(int newSize) {        if (newSize < capacity)            return;//若不符合条件则退出        T *temp = new T[newSize];//定义更大的空间        for (int i = 0; i < m_size; i++)            temp[i] = m_data[i];        delete[]m_data;//释放原有空间        m_data = temp;//将更大的空间设置为正式空间        capacity = newSize;//定义新的容器大小    }//扩充向量容器    void push_back(T x) {        if (m_size == capacity)            resize(capacity * 2);        m_data[m_size++] = x;    }//向向量后面插入一个元素    void pop_back() {        m_size--;    }//删除最后一个数据    T &operator[](int i) {        if (i >= m_size || i < 0)            throw "invalid index:";//下标异常抛出        return m_data[i];    }//[]下标运算符的重载};template void Order(T &Order) //命令函数模板{    int n;    cin >> n;    CVector v(n);    string order;   //命令输入    T x;            //追加的对象    int index;      //插入地址的下标    while (cin >> order) {        try {            if (order == "push") {//push对象,在向量尾部追加对象                cin >> x;                v.push_back(x);            }            else if (order == "put") {//put下标加对象,在特定下标处插入对象                cin >> index >> x;                v[index] = x;            }            else if (order == "fetch") {//fetch用下标取出对象,下标越界处理                cin >> index;                cout << v[index] << " ";            }            else if (order == "quit")                break;        } catch (const char *msg) {            cout << msg << index << " ";        }    }    cout << endl;}int main(){    string order;    int n;    while (cin >> order) {        if (order == "int")            Order(n);        if (order == "string")            Order(order);    }    return 0;}

原创粉丝点击