西北农林科技大学OJ (C++)安全数组类模板

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 <class T>
class Array {
private:
    int size;
    T* a;

public:
    Array(int n) {
        size = n;
        a = new T[size];
    }

    ~Array() {
        delete[] a;
    }

    T& operator[](int i) {
        if (i < 0 || i >= size) {
            cout << "Out of boundary!" << endl;
            exit(0);
        }
        return a[i];
    }

    void sort() {
        std::sort(a, a + size);
    }

    int search(T val) {
        for (int i = 0; i < size; i++) {
            if (a[i] == val)
                return i;
        }
        return -1;
    }

    friend istream& operator>>(istream& myin, Array<T>& arr) {
        for (int i = 0; i < arr.size; i++) {
            myin >> arr.a[i];
        }
        return myin;
    }

    friend ostream& operator<<(ostream& myout, const Array<T>& arr) {
        for (int i = 0; i < arr.size; i++) {
            if (i)
                myout << " ";
            myout << arr.a[i];
        }
        return myout;
    }
};

template<class T>
void Process(Array<T>& arr) {
    cin >> arr;
    cout << arr << endl;
    arr.sort();
    cout << arr << endl;
    int pos;
    cin >> pos;
    cout << arr[pos] << endl;
    T key;
    cin >> key;
    cout << arr.search(key) << endl;
}

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

​

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值