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

#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. BeautifulSoup4 提取数据爬虫用法详解

    Beautiful Soup 是一个HTML/XML 的解析器,主要用于解析和提取 HTML/XML 数据. 它基于 HTML DOM 的,会载入整个文档,解析整个 DOM树,因此时间和内存开销都会大 ...

  2. Latex里的引用定理只出现编号,不出现定理名?

    在前面先定义了: \newtheorem{prb}{Problem Formulation} 然后: \begin{prb} \label{problem} xx\end{prb}效果: Proble ...

  3. 「CF525D」Arthur and Walls

    题目链接 戳我 \(Solution\) 如果一个#要更改,那么一个四个格子的正方形只有他一个是#,bfs弄一下就好了 \(Code\) #include<bits/stdc++.h> u ...

  4. C++入门经典-例7.4-类的静态成员,我们共有一个地球

    1:静态数据在程序开始时即获得空间,直到程序结束后才被收回.静态数据可以声明在函数体内,也可以声明在函数体外. 类中的静态成员与非静态成员有很大区别.从使用上来将,调用静态成员不需要实例化对象,而是以 ...

  5. SRS之RTMP handshake

    1. SrsRtmpServer::handshake 位于 srs_rtmp_stack.cpp. int SrsRtmpServer::handshake() { int ret = ERROR_ ...

  6. 基本CSS布局

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  7. cdn and fallback

    https://www.davepaquette.com/archive/2015/05/06/link-and-script-tag-helpers-in-mvc6.aspx It is a com ...

  8. git add时遇到类似fatal: Path 'XXX' is in submodule 'XXX'错误提示如何解决?

    答:示例如下: fatal: Pathspec 'Vundle.vim/autoload/vundle.vim' is in submodule '.vim/bundle/Vundle.vim' 解决 ...

  9. idea中git远程版本回退

    idea中git远程版本回退 2017年10月15日 15:25:36 gomeplus 阅读数:19313 工作中遇到git远程仓库需要回退到历史版本的问题,根据网上的搜索结果结合自己的实践,整理了 ...

  10. JMeter使用plugins插件进行服务器性能监控

    JMeter使用plugins插件进行服务器性能监控 性能测试时,我们的关注点有两部分 1 服务本身:并发响应时间 QPS 2 服务器的资源使用情况:cpu memory I/O disk等 JMet ...