本题要求实现一个Vector类模板,能实现数据的存储和访问。通过[]
运算符访问时只能访问已经存在的元素,而通过add()
方法访问时可以自动扩展内部存储空间。
注意,这个Vector
的行为和std::vector
是不同的
函数接口定义:
template <class T>
class Vector {
...
裁判测试程序样例:
#include <iostream>
using namespace std;
/* 请在这里填写答案 */
int main()
{
Vector<int> vint;
int n,m;
cin >> n >> m;
for ( int i=0; i<n; i++ ) {
// add() can inflate the vector automatically
vint.add(i);
}
// get_size() returns the number of elements stored in the vector
cout << vint.get_size() << endl;
cout << vint[m] << endl;
// remove() removes the element at the index which begins from zero
vint.remove(m);
cout << vint.add(-1) << endl;
cout << vint[m] << endl;
Vector<int> vv = vint;
cout << vv[vv.get_size()-1] << endl;
vv.add(m);
cout << vint.get_size() << endl;
}
输入样例:
100 50
输出样例:
100
50
99
51
-1
100
思路:
根据main函数里的代码和测试结果来进行分析,由main函数可知,至少应该有get_size()、remove()、add()、[]运算符重载这几个点,再由测试结果知,应该要有一个指针动态申请空间,动态申请就应该有一个空间大小,还要有一个整数记录下标。整理整理思路下面我们开始敲代码!
答案代码如下:
template <class T>
class Vector
{
int tos=0; //创建一个整数用于下标表示
const int size=100; //创建一个常数用于表示动态申请空间大小
T*data; //定义一个指针,用于动态申请空间
public:
Vector() //构造函数动态申请空间
{
data=new T[size];
}
int add(int i)
{
//data=new T[size]; //不能在add函数里申请空间,因为作用域小了,add函数结束空间就被自动注销了
data[tos]=i; //存入数组
tos++;
return tos-1; //返回tos-1是根据main函数结果来的
}
int get_size()
{
return tos; //下标就代表了数组大小
}
void remove(int m)
{
for(int i=m; i<tos-1; i++) //移除某个值后后面的值需要填补上,
{
data[i]=data[i+1];
}
tos--;
}
const T& operator[](int i)//重载了[]运算符
{
return data[i];
}
};
总体而言难度不大,大家仔细分析想清楚就好!