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