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 ...
随机推荐
- elastic search&logstash&kibana 学习历程(二)es基础知识
简介:es的index索引,document文档对象,副本,多节点集群等基础知识 1.通俗的解释: 在Elasticsearch中,文档归属于一种类型(type),而这些类型存在于索引(index)中 ...
- PTA 笛卡尔树
笛卡尔树 (25 分) 笛卡尔树是一种特殊的二叉树,其结点包含两个关键字K1和K2.首先笛卡尔树是关于K1的二叉搜索树,即结点左子树的所有K1值都比该结点的K1值小,右子树则大.其次所有结点的K2关键 ...
- Eclipse在线安装插件进度缓慢问题
最近在学习Maven的过程中需要安装m2e 插件,在线安装的缓慢速度实在是让人抓狂,故将自己最后的解决方案记录下来,以供其他人参考. 最终的原因是安装时同时检查更新了其他插件的最新版,所以安装插件时注 ...
- R-ts()
概述 ts(gm,frequency=12,start=c(1975,1)) 这个命令表示: frequency=12表明时间单位为年,而且在每一个时间单位中有12个均匀间隔的观察值. 因此gm是 ...
- 简单的SSRF的学习
自己眼中的SSRF 成因 服务端允许了 可以向其他服务器请求获取一些数据 通过各种协议 http https file等(外网服务器所在的内网进行端口的扫描指纹的识别等) 一SSRF配合redis未授 ...
- 实现自己的SpringMVC
一.SpringMVC的工作原理 SpringMVC流程 1. 用户发送请求至前端控制器DispatcherServlet. 2. DispatcherServlet收到请求调用HandlerMa ...
- TCP层close系统调用的实现分析
在调用close系统调用关闭套接字时,如果套接字引用计数已经归零,则需继续向上层调用其close实现,tcp为tcp_close:本文仅介绍tcp部分,前置部分请参考本博关于close系统调用的文章: ...
- oracle性能诊断sql
--1.阻塞及等待事件信息查询-- 查询所有会话的状态.等待类型及当前正在执行的SQL脚本select t.SID, t.SERIAL#, t.Status, t.Action, t.Event, t ...
- 编写javad代码实现使用Scanner从键盘读取一行输入,去掉其中重复字符, 打印出不同的那些字符
package com.loaderman.test; import java.util.HashSet; import java.util.Scanner; public class Test2 { ...
- Utf8 与 Utf8-BOM 的差异
1.先说差异,Utf8-BOM编码的字符串比Utf8编码的字符串,多了前缀\xEF\xBF\xBD,肉眼是看不出来的,解析出来的字符串的长度也正常 比如:"123456",Enco ...