c++练习之模板类的练习

编写一维数组模板。可以无限扩展,任意数据类型,可以进行插入,删除,查找,排序等操作

#include<iostream>
using std::cout;
using std::cin;
using std::endl;
template <class T>
class CTest
{
public:
    CTest(T *p,int a):n(a)//普通数据类型的构造函数
    {
        arr = new T[n];
        for (int i=0;i<n;i++)
        {
            *(arr + i) = *(p + i);
        }
    }
    CTest(const char* p)//字符类型的构造函数
    {
        n = strlen(p) + 1;
        arr = new T[n];
        strcpy_s(arr, n, p);
    }
    ~CTest()
    {
        delete[]arr;
        arr = NULL;
    }
    int sortD()//按大到小的顺序排序
    {
        T temp;
        for (int i = 0; i < n; i++)
        {
            for (int j = i + 1; j<n;j++)
            {
                if (arr[j] > arr[i])
                {
                    temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        return 0;
    }
    int searchD(T t)
    {
        for (int i=0;i<n;i++)
        {
            if (t==*(arr+i))
            {
                return i;
            }
        }
        return -1;
    }
    int insertD(T t,int x)//增加数据 参数:插入的数据 和插入的位置
    {
        T* des = new T[++n];
        if (n-x>=2)
        {
            for (int i =n; i>=0 ;i--)
            {
                if (i>x)
                {
                    *(des + i) = *(arr + i - 1);
                }
                else if (i==x)
                {
                    *(des + i) = t;
                }
                else
                {
                    *(des + i) = *(arr + i);
                }        
            }
            delete[]arr;
            arr = NULL;
            arr = new T[n];
            copyD(arr, des);
            return 0;
        }
        else
        {
            return -1;
        }
    }
    int deleD(T t)//删除数据
    {
        for (int i=0;i<n;i++)
        {
            if (*(arr+i)==t)
            {
                for (int j = i; j < n-1; j++)
                {
                    *(arr + j) = *(arr + j + 1);
                }
                n--;
                return 0;
            }
        }
        
        return -1;
    }
    int copyD(T t1[], T t2[])//将t2拷贝到t1
    {
        for (int i=0;i<n;i++)
        {
            t1[i] = t2[i];
        }
        return 0;
    }
    void show() {//输出数组
        for (int i = 0; i < n; i++)
        {
            cout<<*(arr+i)<<" "  ;
        }
        cout << endl;
    }
private:
    T *arr;
    int n;
};
int main()
{
    int a[5] = {1,5,6,7,2 };
    const char *c = "145644";
    //CTest<int> cint(a,5);
    CTest<char> cint(c);
    int flag = 1;
    int x;
    while (flag)
    {
        cout << "1 插入数据:" << endl;
        cout << "2 删除数据:" << endl;
        cout << "3 查找数据:" << endl;
        cout << "4 查看数据:" << endl;
        cout << "5 排序数据:" << endl;
        cout << "6 退出程序:" << endl;
        cout << "请输入你的操作码:" << endl;
        cin >> x;
        switch (x)
        {
            case 1:
            {
                char a ;
                int b;
                cout << "请输入要插入的数据" << endl;
                cin >> a;
                cout << "请输入要插入的位置" << endl;
                cin >> b;
                if (cint.insertD(a, b) == 0)
                {
                    cout << "操作成功,返回主界面" << endl;
                }
                else
                {
                    cout << "操作失败,请重试" << endl;
                }
                
            }
            break;
            case 2:
            {
                char a;
                cout << "请输入要删除的数据" << endl;
                cin >> a;
                if (cint.deleD(a) == 0)
                {
                    cout << "操作成功,返回主界面" << endl;
                }
                else
                {
                    cout << "操作失败,请重试" << endl;
                }
            }
            break;
            case 3:
            {
                char a;
                cout << "请输入要查询的数据" << endl;
                cin >> a;
                int b = cint.searchD(a);
                if ( b>= 0)
                {
                    cout << "操作成功,数据下标为" <<b<< endl;
                }
                else
                {
                    cout << "操作失败,请重试" << endl;
                }

            }
            break;
            case 4:
            {
                cout << "查询结果" << endl;
                cint.show();
            }
            break;
            case 5:
            {
                cout << "大到小的排序结果" << endl;                
                if (cint.sortD() == 0)
                {
                    cint.show();
                }
                else
                {
                    cout << "操作失败,请重试" << endl;
                }                
            }
            break; 
            case 6:
            {
                flag = 0;
            }
            break;
            default: break;
        }
        
    }
}

(自己测试int 类型和char基本没问题 。)

c++练习之模板类的练习

 

还有一些小问题没解决。比如我的类类型是char 那么增删的时候需要键入一个数据用char 接收。如果类型int 那么就又要用int类型去接收键入的数据代码需要来回改动。如果能让接收的变量类型和类类型自动保持一致或达到类型效果。那代码就不需要老是改动了。有没有知道的大佬教教我怎么修改?

上一篇:linux安装MySQL后输入mysql显示 ERROR 2002 (HY000): Can't connect to local MySQL server through socket


下一篇:C++实现DES加密解密