安全数组类模板

📅 2026/7/14 11:35:00 👁️ 阅读次数 📝 编程学习
安全数组类模板

Description

设计一个安全数组类模板Array<T>,其中包含数组的输入、输出、排序和查找等方法,使用三种类型的数据对其进行测试。

(1)设计构造函数Array<T>::Array(int n),可动态分配n个T类型的存储空间;

(2)设计析构函数Array<T>::~Array()释放内存;

(3)重载输入流运算符istream &operator>>(istream& in, Array<T>& arr)读入n个T类型数据;

(4)重载输出流运算符ostream &operator<<(ostream& out, const Array<T>& arr)输出n个T类型数据;

(5)重载[]运算符,若索引值i越界,则输出“Out of boundary”并退出程序,否则返回第i个数据元素;

(6)基于<algorithm>中的sort函数定义成员函数void Array<T>::sort(),实现数组排序;

(7)设计成员函数int Array<T>::search(T e)const,若查找成功返回非负索引值,否则返回-1;

(8)设计函数模板void Process(Array<T> &a)用于测试数组类模板。

main函数对应测试代码如下:

int main() { string type; int n; cin >> type >> n; if (type=="int") { Array<int> a(n); Process(a); } else if (type=="double") { Array<double> a(n); Process(a); } else if (type=="string") { Array<string> a(n); Process(a); } else cout << "Input error!" << endl; return 0; }

Input

数据类型type和元素个数n

n个数据元素

索引值pos

查找键值key

Output

排序前数据序列

排序后数据序列

索引值pos对应数据元素

查找到的数据元素索引值

Sample Input 1

int 5 18 2 4 6 25 2 6

Sample Output 1

18 2 4 6 25 2 4 6 18 25 6 2

Sample Input 2

double 6 24.5 3.6 18.3 96.4 102.56 88.1 3 102

Sample Output 2

24.5 3.6 18.3 96.4 102.56 88.1 3.6 18.3 24.5 88.1 96.4 102.56 88.1 -1

Sample Input 3

string 7 dispose campus budget slip bacteria consume blast 7 campus

Sample Output 3

dispose campus budget slip bacteria consume blast bacteria blast budget campus consume dispose slip Out of boundary!

示例代码

#include <iostream> #include <string> #include <algorithm> using namespace std; template<typename T> class Array { int size_; T *arr; public: Array(int n) : size_(n) { arr = new T[n]; } ~Array() { delete[] arr; } int getsize() const { return size_; } template<typename Ti> friend istream& operator>>(istream& in, Array<Ti>& arr); template<typename To> friend ostream& operator<<(ostream& out, const Array<To>& arr); // 排序函数,按题目要求命名为 sort void sort() { std::sort(arr, arr + size_); } // 查找函数,按题目要求命名为 search,且为 const 成员 int search(const T& e) const { for (int i = 0; i < size_; ++i) { if (arr[i] == e) return i; } return -1; } T& operator[](const int index) { if (index < 0 || index >= size_) { cout << "Out of boundary!" << endl; exit(0); } return arr[index]; } }; // 输入运算符重载 template<typename Ti> istream& operator>>(istream& in, Array<Ti>& obj) { for (int i = 0; i < obj.getsize(); ++i) in >> obj.arr[i]; return in; } // 输出运算符重载 template<typename To> ostream& operator<<(ostream& out, const Array<To>& obj) { for (int i = 0; i < obj.getsize(); ++i) { if (i) out << ' '; out << obj.arr[i]; } return out; } // 测试函数模板 template <typename T> void Process(Array<T>& a) { int pos; T e; cin >> a; // 读入数组 cout << a << endl; // 排序前 a.sort(); // 排序(调用 sort) cout << a << endl; // 排序后 cin >> pos; cout << a[pos] << endl; // 输出下标对应元素(可能越界) cin >> e; cout << a.search(e) << endl; // 查找(调用 search) } int main() { string type; int n; cin >> type >> n; if (type == "int") { Array<int> a(n); Process(a); } else if (type == "double") { Array<double> a(n); Process(a); } else if (type == "string") { Array<string> a(n); Process(a); } else { cout << "Input error!" << endl; } return 0; }