设计一个数组类模板(Array),要求重载输入和输出运算符,实现对数组内数据的输入和输出,并设计成员函数sort(),当数组内数据是int,double型时,按照从小到大的顺序对数组数据进行排序并输出结果;当数组内数据是char型时,按照ASCII码从小到大的顺序排序并输出结果;当数组内数据为Student类型时,按照成绩(没有重复值)从小到大的顺序,输出排序后的学生学号。
时间: 2024-03-13 15:44:48 浏览: 112
类模板+运算符重载(成员函数形式)
4星 · 用户满意度95%
下面是一个实现上述要求的Array类模板的示例代码:
```c++
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
class Student {
public:
int id;
double score;
bool operator<(const Student& other) const {
return score < other.score;
}
};
template<typename T>
class Array {
public:
Array(int size) {
data.resize(size);
}
friend ostream& operator<<(ostream& os, const Array& arr) {
for (int i = 0; i < arr.data.size(); i++) {
os << arr.data[i] << " ";
}
return os;
}
friend istream& operator>>(istream& is, Array& arr) {
for (int i = 0; i < arr.data.size(); i++) {
is >> arr.data[i];
}
return is;
}
void sort() {
if constexpr (is_same_v<T, int> || is_same_v<T, double>) {
std::sort(data.begin(), data.end());
}
else if constexpr (is_same_v<T, char>) {
std::sort(data.begin(), data.end(), [](T a, T b){return a < b;});
}
else if constexpr (is_same_v<T, Student>) {
std::sort(data.begin(), data.end(), [](Student a, Student b){return a < b;});
for (int i = 0; i < data.size(); i++) {
for (int j = i + 1; j < data.size(); j++) {
if (data[j].score == data[i].score) {
std::swap(data[i], data[j]);
}
else {
break;
}
}
}
for (int i = 0; i < data.size(); i++) {
cout << data[i].id << " ";
}
}
}
private:
vector<T> data;
};
int main() {
Array<int> arr1(5);
cin >> arr1;
cout << arr1 << endl;
arr1.sort();
cout << arr1 << endl;
Array<double> arr2(5);
cin >> arr2;
cout << arr2 << endl;
arr2.sort();
cout << arr2 << endl;
Array<char> arr3(5);
cin >> arr3;
cout << arr3 << endl;
arr3.sort();
cout << arr3 << endl;
Array<Student> arr4(5);
for (int i = 0; i < arr4.data.size(); i++) {
cin >> arr4.data[i].id >> arr4.data[i].score;
}
arr4.sort();
return 0;
}
```
在上面的代码中,我们定义了一个Array类模板,该模板包含一个私有成员变量data,用于存储数组数据。我们又重载了输入运算符和输出运算符,实现了对数组数据的输入和输出功能。我们又定义了一个sort()成员函数,根据不同的数据类型排序并输出结果。在sort()成员函数中,我们使用了C++17的if constexpr语法,根据不同的数据类型采用不同的排序方式。当数组内数据是int或double型时,我们使用std::sort()函数排序;当数组内数据是char型时,我们使用std::sort()函数和一个lambda表达式排序;当数组内数据是Student型时,我们使用std::sort()函数和一个重载了小于运算符的Student类排序,并且还需要对成绩相同的学生进行处理。
在主函数中,我们分别创建了四个不同类型的Array对象,并测试了输入、输出、排序等功能。
阅读全文