4005:类模板
Problem Description
定义一个类模板,包括一个由小到大排列的数据序列,数据元素个数等数据成员,以及构造函数、输出函数和删除函数等成员函数。其中,删除函数用来删除数据系列中相同的数据。
Input
输入数据有多组,每组占3行, 第一行是整数,第二行是实数,第三行是字符。每行的第一个数是整数,表示元素个数。
Output
对于每组输入数据,输出占3行,每行输出删除相同元素后剩下的元素,每个元素后都带有1个空格。具体见输出样例。
Sample Input
5 1 2 2 3 5
6 2.4 2.4 3.3 3.3 4 6
8 aabbccdd
Sample Output
1 2 3 5
2.4 3.3 4 6
a b c d
心得
定义类模板比较容易,声明模板类型 T ,然后将数组类型定义为 T 就好。
其实就个人感觉而言,这题在声明类模板上并没有什么难度,主要是如何给数组去重。因为题目中只涉及到了三个基本数据类型,所以只要用等号进行匹配就好。
在本次题目中,我们的数组是已经从小到大排序好了,所以我们可以这么比对:定义临时数组 newArr,遍历原始数组 arr,只要当前元素和下一个元素不相等,我们就认定当前元素不重复,将其纳入到 newArr 中,原始数组遍历完成后,将其指针指向 newArr (arr = newArr;
)。
答案
#include <iostream>
#include <cstring>
using namespace std;
template<class T>
class array
{
private:
int length;
T *arr;
public:
array(int length,T *s):length(length)
{
arr=new T[length];
for(int i=0;i<length;i++)
arr[i]=s[i];
}
void show()
{
for(int i=0;i<length;i++)
cout<<arr[i]<<" ";
cout<<endl;
}
void clear()
{
int top=0;
T *newArr=new T[length];
for(int i=0;i<length-1;i++)
{
if(arr[i]!=arr[i+1])
newArr[top++]=arr[i];
}
if(newArr[top-1]!=arr[length-1])
newArr[top++]=arr[length-1];
length=top;
arr=newArr;
}
~array()
{
delete[] arr;
}
};
int main()
{
int n,*a1;
double *a2;
char *a3;
while(cin>>n)
{
a1=new int[n];
for(int i=0;i<n;i++)
cin>>a1[i];
array<int> t1(n,a1);
t1.clear();
t1.show();
cin>>n;
a2=new double[n];
for(i=0;i<n;i++)
cin>>a2[i];
array<double> t2(n,a2);
t2.clear();
t2.show();
cin>>n;
a3=new char[n];
for(i=0;i<n;i++)
cin>>a3[i];
array<char> t3(n,a3);
t3.clear();
t3.show();
delete[] a1,a2,a3;
}
return 0;
}