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 ...
随机推荐
- AJAX-基础-1
概述 AJAX = Asynchronous JavaScript And XML(异步 JavaScript 及 XML) AJAX 是 Asynchronous JavaScript And XM ...
- find命令不递归查询子目录
[root@dbrg-2 test]# find . ! -name "." -type d -prune -o -type f -name "*.jpg" ...
- VirtualBox——在Win7的HOST上安装配置虚拟机CentOS7
在Win7为HOST的环境下,安装VirtualBox,在其中安装CentOS7,以Bridge的方式搭建网络环境. 主要配置包括VirtualBox中的网络设置,以及CentOS中的网络配置.另外还 ...
- oracle查看表空间的大小及使用情况sql语句
--------------------------tablespace------------------------------------------------ 1.//查看表空间的名称及大小 ...
- 开源运维自动化平台-opendevops
开源运维自动化平台-opendevops 简介 官网 | Github| 在线体验 CODO是一款为用户提供企业多混合云.自动化运维.完全开源的云管理平台. CODO前端基于Vue iview开发. ...
- DP&图论 DAY 1 下午
DP&图论 DAY 1 下午 区间和序列上的DP 序列上的DP >序列上的dp状态设计最基本的形式 F[i]表示以 i 结尾的最优值或方案数.◦ F[i][k]表示以 i 结尾附加 ...
- ubuntu下编译linux内核之前需要做哪些准备?
答: 安装必要的工具(笔者使用的ubuntu代号为bionic) sudo apt-get install -y bison flex
- android下载网络图片,设置宽高,等比缩放
使用Picasso组件去下载图片会发现图片宽高会变形不受等比缩放控制,即使设置了图片的 scaleType,可能是对Picasso的api没有用对, Picasso.with(this.activit ...
- 设置placeholder 颜色
::-webkit-input-placeholder { /* WebKit browsers */ color: rgb(100, 193, 173); } :-moz-placeholder { ...
- Centos7 Devstack [Rocky] 重启后无法联网
部署devstack-rocky版本后网络,可以 Ping 通自己的 IP,但 Ping 不同网关,ping不通同网段主机,查看网卡和ovs信息如下 解决 第一步 按造网上教程,修改br-ex,ens ...