西北农林科技大学2024学年C++面向对象程序设计OJ——T14 安全数组类模板

一.题目描述

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!

三.代码

cpp 复制代码
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
template<typename T>
class Array{
    int size_;
    T *arr;
public:
    Array(int n):size_(n){this->arr=new T[n];}
    ~Array(){delete[] arr;}
    int getsize()const{return this->size_;}
    template<typename Ti>
    friend istream &operator>>(istream& in,Array<Ti>& arr);
    template<typename To>
    friend ostream &operator<<(ostream& in,const Array<To>& arr);
    void sort_arr(){sort(arr,arr+size_);}
    int Search(T e){
        for(int i=0;i<size_;i++){
            if(arr[i]==e)
                return i;
        }
        return -1;
    }
    T& operator[](const int index){
        if(index<0 || index>=this->size_){
            cout<<"Out of boundary!"<<endl;
            exit(0);
        }
        return this->arr[index];
    }
};
template <typename T>
void Process(Array<T> &a){
        int pos;
        T e;
        cin>>a;
        cout<<a<<endl;
        a.sort_arr();
        cout<<a<<endl;
        cin>>pos;
        cout<<a[pos]<<endl;
        cin>>e;
        cout<<a.Search(e)<<endl;
}
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){
    int i;
    for(i=0;i<obj.getsize()-1;i++){
        	out<<obj.arr[i]<<" ";
    }
    out<<obj.arr[i];
    return out;
}
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;
}
相关推荐
可均可可29 分钟前
C++之OpenCV入门到提高004:Mat 对象的使用
c++·opencv·mat·imread·imwrite
白子寰1 小时前
【C++打怪之路Lv14】- “多态“篇
开发语言·c++
小芒果_011 小时前
P11229 [CSP-J 2024] 小木棍
c++·算法·信息学奥赛
gkdpjj1 小时前
C++优选算法十 哈希表
c++·算法·散列表
王俊山IT1 小时前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习
-Even-1 小时前
【第六章】分支语句和逻辑运算符
c++·c++ primer plus
我是谁??2 小时前
C/C++使用AddressSanitizer检测内存错误
c语言·c++
发霉的闲鱼2 小时前
MFC 重写了listControl类(类名为A),并把双击事件的处理函数定义在A中,主窗口如何接收表格是否被双击
c++·mfc
小c君tt2 小时前
MFC中Excel的导入以及使用步骤
c++·excel·mfc
xiaoxiao涛2 小时前
协程6 --- HOOK
c++·协程