参考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; }