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

#include 
   
   
    
    
#include 
    
    
     
     
using namespace std;
#define SIZE 10

template 
     
     
      
      
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; } 
       
      
      
     
     
    
    
   
   

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐