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

#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=;i<n;i++)
{
*(arr + i) = *(p + i);
}
}
CTest(const char* p)//字符类型的构造函数
{
n = strlen(p) + ;
arr = new T[n];
strcpy_s(arr, n, p);
}
~CTest()
{
delete[]arr;
arr = NULL;
}
int sortD()//按大到小的顺序排序
{
T temp;
for (int i = ; i < n; i++)
{
for (int j = i + ; j<n;j++)
{
if (arr[j] > arr[i])
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
return ;
}
int searchD(T t)
{
for (int i=;i<n;i++)
{
if (t==*(arr+i))
{
return i;
}
}
return -;
}
int insertD(T t,int x)//增加数据 参数:插入的数据 和插入的位置
{
T* des = new T[++n];
if (n-x>=)
{
for (int i =n; i>= ;i--)
{
if (i>x)
{
*(des + i) = *(arr + i - );
}
else if (i==x)
{
*(des + i) = t;
}
else
{
*(des + i) = *(arr + i);
}
}
delete[]arr;
arr = NULL;
arr = new T[n];
copyD(arr, des);
return ;
}
else
{
return -;
}
}
int deleD(T t)//删除数据
{
for (int i=;i<n;i++)
{
if (*(arr+i)==t)
{
for (int j = i; j < n-; j++)
{
*(arr + j) = *(arr + j + );
}
n--;
return ;
}
} return -;
}
int copyD(T t1[], T t2[])//将t2拷贝到t1
{
for (int i=;i<n;i++)
{
t1[i] = t2[i];
}
return ;
}
void show() {//输出数组
for (int i = ; i < n; i++)
{
cout<<*(arr+i)<<" " ;
}
cout << endl;
}
private:
T *arr;
int n;
};
int main()
{
int a[] = {,,,, };
const char *c = "";
//CTest<int> cint(a,5);
CTest<char> cint(c);
int flag = ;
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 :
{
char a ;
int b;
cout << "请输入要插入的数据" << endl;
cin >> a;
cout << "请输入要插入的位置" << endl;
cin >> b;
if (cint.insertD(a, b) == )
{
cout << "操作成功,返回主界面" << endl;
}
else
{
cout << "操作失败,请重试" << endl;
} }
break;
case :
{
char a;
cout << "请输入要删除的数据" << endl;
cin >> a;
if (cint.deleD(a) == )
{
cout << "操作成功,返回主界面" << endl;
}
else
{
cout << "操作失败,请重试" << endl;
}
}
break;
case :
{
char a;
cout << "请输入要查询的数据" << endl;
cin >> a;
int b = cint.searchD(a);
if ( b>= )
{
cout << "操作成功,数据下标为" <<b<< endl;
}
else
{
cout << "操作失败,请重试" << endl;
} }
break;
case :
{
cout << "查询结果" << endl;
cint.show();
}
break;
case :
{
cout << "大到小的排序结果" << endl;
if (cint.sortD() == )
{
cint.show();
}
else
{
cout << "操作失败,请重试" << endl;
}
}
break;
case :
{
flag = ;
}
break;
default: break;
} }
}

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

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

c++练习之模板类的练习的更多相关文章

  1. 单链表的C++实现(采用模板类)

    采用模板类实现的好处是,不用拘泥于特定的数据类型.就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作.  链表结构定义 定义单链表 ...

  2. 模板类 error LNK2019: 无法解析的外部符号

    如果将类模板的声明和实现写在两个独立的文件中,在构建时会出现"error LNK2019: 无法解析的外部符号 "的错误. 解决方法有: 第一种方法,就是把类模板中成员函数的声明和 ...

  3. 关于g++编译模板类的问题

    今天搞了我接近4个小时,代码没错,就是调试没有通过,无论怎么也没有想到是编译器的问题 g++不支持c++模板类 声明与实现分离,都要写到.h文件里面. 以后记住了.

  4. C++11特性(模板类 initializer_list)

    [1]initializer_list模板类 C++primer 原文如下: 通读原文相关篇幅,分析解读内容如下: 提供initializer_list类的初衷,为了便于将有限个同一类型(或可转换为同 ...

  5. C++11模板类使用心得

    1.推荐使用std::shared_ptr<TaskT>代替指针TaskT*使用,shared_ptr是一种智能指针,能自主销毁释放内存,在c++11中被引入,在多线程编程中有很大的用处, ...

  6. c++模板类

    c++模板类 理解编译器的编译模板过程 如何组织编写模板程序 前言常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”.看看我们几乎每天都能遇到的模板类吧,如S ...

  7. C++ 模板函数与模板类

    一.模板函数 函数模板提供了一类函数的抽象,即代表了一类函数.当函数模板被实例化后,它会生成具体的模板函数.例如下面便是一个函数模板:

  8. 模板类重载<<运算符

    写了一个Matrix模板类,需要重载<<, 1.需要友元函数 2.需要此函数的实现在.h中(本人试验出来的,放在.cpp中编译不通过) template <typename T> ...

  9. C++模板类的使用

    1.定义模板类 通过类似于下面的语法可以定义一个模板类: template<typename T> class Job : public virtual RefBase { public: ...

  10. C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)

    1.  主版本模板类 首先我们来看一段初学者都能看懂,应用了模板的程序: 1 #include <iostream> 2 using namespace std; 3 4 template ...

随机推荐

  1. 关于web前端开发,区别用户使用的终端设备代码

    对web前端开发,熟知不同的浏览器,的解析是基本技能,下面,我就向大家展示一下,如何获得当前用户所用的终端设备.车子一发动,请准备上车................... <script> ...

  2. 【Nginx】 linux环境下安装nginx步骤

    开始前,请确认gcc g++开发类库是否装好,默认已经安装. centos平台编译环境使用如下指令 安装make: yum -y install gcc automake autoconf libto ...

  3. Springboot集成MongoDB实现CRUD

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  4. C++之多继承与虚继承

    1. 多继承 1.1 多继承概念 一个类有多个直接基类的继承关系称为多继承 多继承声明语法 class 派生类名 : 访问控制 基类名1, 访问控制 基类名2, ... { 数据成员和成员函数声明 } ...

  5. linux下无root源码安装软件

    先进入源码文件夹下指定安装路径 ./configure --prefix=/public/home/ztu/usr/samtools 编译 make 安装 make install 写入环境变量 vi ...

  6. bootstrap-table前端实现多条件时间段查询数据

    实现思路:通过正则匹配到字段是否符合条件,时间段转换为时间戳比对. 这是大体的效果图: 页面的html代码 <div class="content-head mgb10"&g ...

  7. js小数点相乘或相除出现多位数的问题

    最近做一个支付的项目需要做个计算器,所以发现了一个问题. 比如: 0.03/0.00003=999.9999999999999 0.0003*0.3=0.000029999999999999997 0 ...

  8. While 循环 kotlin(11)

    While 循环while 和 do .. while 照常使用 while (x > 0) { x--} do { val y = retrieveData()} while (y != nu ...

  9. Spring Annotations

    @Bean 这是一个方法注解,作用是实例化一个Bean并使用该方法的名臣命名.

  10. SQL Server分页的存储过程写法以及性能比较

    ------创建数据库data_Test ----- create database data_Test GO use data_Test GO create table tb_TestTable - ...