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=;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++练习之模板类的练习的更多相关文章
- 单链表的C++实现(采用模板类)
采用模板类实现的好处是,不用拘泥于特定的数据类型.就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作. 链表结构定义 定义单链表 ...
- 模板类 error LNK2019: 无法解析的外部符号
如果将类模板的声明和实现写在两个独立的文件中,在构建时会出现"error LNK2019: 无法解析的外部符号 "的错误. 解决方法有: 第一种方法,就是把类模板中成员函数的声明和 ...
- 关于g++编译模板类的问题
今天搞了我接近4个小时,代码没错,就是调试没有通过,无论怎么也没有想到是编译器的问题 g++不支持c++模板类 声明与实现分离,都要写到.h文件里面. 以后记住了.
- C++11特性(模板类 initializer_list)
[1]initializer_list模板类 C++primer 原文如下: 通读原文相关篇幅,分析解读内容如下: 提供initializer_list类的初衷,为了便于将有限个同一类型(或可转换为同 ...
- C++11模板类使用心得
1.推荐使用std::shared_ptr<TaskT>代替指针TaskT*使用,shared_ptr是一种智能指针,能自主销毁释放内存,在c++11中被引入,在多线程编程中有很大的用处, ...
- c++模板类
c++模板类 理解编译器的编译模板过程 如何组织编写模板程序 前言常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”.看看我们几乎每天都能遇到的模板类吧,如S ...
- C++ 模板函数与模板类
一.模板函数 函数模板提供了一类函数的抽象,即代表了一类函数.当函数模板被实例化后,它会生成具体的模板函数.例如下面便是一个函数模板:
- 模板类重载<<运算符
写了一个Matrix模板类,需要重载<<, 1.需要友元函数 2.需要此函数的实现在.h中(本人试验出来的,放在.cpp中编译不通过) template <typename T> ...
- C++模板类的使用
1.定义模板类 通过类似于下面的语法可以定义一个模板类: template<typename T> class Job : public virtual RefBase { public: ...
- C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)
1. 主版本模板类 首先我们来看一段初学者都能看懂,应用了模板的程序: 1 #include <iostream> 2 using namespace std; 3 4 template ...
随机推荐
- MySQL_(Java)分页查询MySQL中的数据
MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC创建用户名和密码校验查询方法 传送门 MySQL_(Java)使用preparestatement ...
- 20175214 MySort(选做)
一.题目要求 模拟实现Linux下Sort -t : -k 2的功能. 要有伪代码,产品代码,测试代码(注意测试用例的设计) 参考 Sort的实现.提交博客链接. 二.设计思路 在命令行中输入需要的参 ...
- IP输出 之 ip_local_out
概述 将要从本地发出的数据包,会在构造了ip头之后,调用ip_local_out函数,该函数设置数据包的总长度和校验和,然后经过netfilter的LOCAL_OUT钩子点进行检查过滤,如果通过,则调 ...
- php项目权限系统设计
原文地址:https://blog.csdn.net/u013090676/article/details/77893237 说起php的权限,很多人都容易想起rbac,这里不多介绍.下面介绍一种通用 ...
- SpringBoot2.X 静态文件配置
Spring Boot 默认会挨个从 META/resources > resources > static > public 里面找是否存在相应的资源,如果有则直接返回. 默认配置 ...
- 在win10系统安装两个不同版本的mySQL数据库
我们项目用的mySQL数据库,为了回家看代码方便,于是在本地安装mySQL数据库,一开始安装了比服务器mySQL5.7.24更高版本的mySQL8.0.11,结果项目启动报错,估计是版本太高项目中引入 ...
- linux vim的全目录搜索 和 hostname的设置?
vim下的搜索命令是: vimgrep, 简写就是vim. 关于这个全局搜索的用法根grep的差不多, 但是, 如果你直接使用 grep的话 就会在vim的外部执行, 根vim内部就没有什么关系了, ...
- android开发过程报错
Unable to start activity ComponentInfo{com.example.zxy.myapp/com.example.zxy.myapp.MainActivity}: an ...
- Redis ==> 集群的三种模式
一.主从同步/复制 通过持久化功能,Redis保证了即使在服务器重启的情况下也不会丢失(或少量丢失)数据,因为持久化会把内存中数据保存到硬盘上,重启会从硬盘上加载数据. 但是由于数据是存储在一台服务器 ...
- Spring学习之==>AOP
一.概述 AOP(Aspect Oriented Programming)称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等等,Struts2的拦截器设计就是基于A ...