一个自己实现的Vector(只能处理基本类型数据)

转载自: https://www.ev0l.art/index.php/archives/22/

  • string 类型不行

  • bool char* int double float long long 等基本类型可用

  • 使用模板类实现。底层为数组实现。

  • dvector.h

  1. #ifndef DVECTOR_H
  2. #define DVECTOR_H
  3. #pragma once
  4. #include <iostream>
  5. template <class T>
  6. class dvector
  7. {
  8. public:
  9. dvector();
  10. ~dvector();
  11. bool push_back(T);
  12. void show();
  13. public:
  14. T* p;
  15. int len;
  16. int real_len;
  17. };
  18. #endif // DVECTOR_H
  • dvector.cpp
  1. #include "dvector.h"
  2. template <class T>
  3. dvector<T>::dvector()
  4. {
  5. len=real_len =0;
  6. p=nullptr;
  7. }
  8. template<class T>
  9. dvector<T>::~dvector()
  10. {
  11. if(p!=nullptr)
  12. {
  13. delete []p;
  14. p=nullptr;
  15. }
  16. }
  17. template <class T>
  18. void dvector<T>::show()
  19. {
  20. if(p!=nullptr)
  21. {
  22. for(int i=0;i<real_len;i++){
  23. std::cout<<i<<"\t"<<*(p+i)<<std::endl;
  24. }
  25. std::cout<<"length="<<real_len<<std::endl;
  26. }else {
  27. std::cout<<"NNNNNNNNNNNNNNNNNNNNNNNNNNo thing"<<std::endl;
  28. }
  29. }
  30. template<class T>
  31. bool dvector<T>::push_back(T t){
  32. if(p==nullptr)
  33. {
  34. //第一个为空说明只有一个元素
  35. p=new T;
  36. *p=t;
  37. real_len=len=1;
  38. }else {
  39. //第一个不为空说明有多个元素,这时候链表就必须重新分配内存
  40. //分配为数组形式
  41. T *ptemp = new T[real_len+1];
  42. for(int i=0;i<real_len;i++)
  43. {
  44. *(ptemp+i)=*(p+i);
  45. }
  46. *(ptemp+real_len)=t;
  47. delete []p;
  48. p=ptemp;
  49. real_len+=1;
  50. len+=1;
  51. }
  52. return true;
  53. }
  54. int main()
  55. {
  56. //测试基本类型
  57. //string 会出错,因为string 不是基本类型,是一种类似 vector 的类模板,其内部的内存操作与基本类型不一样。
  58. //1. int
  59. dvector<int>* dv1=new dvector<int>;
  60. dv1->push_back(12);
  61. dv1->push_back(15);
  62. dv1->push_back(1995);
  63. dv1->push_back(200);
  64. dv1->push_back(2);
  65. dv1->push_back(1);
  66. dv1->show();
  67. //2. double
  68. dvector<double>* dv2=new dvector<double>;
  69. dv2->push_back(12.2);
  70. dv2->push_back(15.3);
  71. dv2->push_back(1995.0220);
  72. dv2->push_back(200.1);
  73. dv2->push_back(2.3);
  74. dv2->push_back(1.9);
  75. dv2->show();
  76. //3. char*
  77. dvector<char*>* dv3=new dvector<char*>;
  78. dv3->push_back("nimei");
  79. dv3->push_back("de");
  80. dv3->push_back("垃圾");
  81. dv3->push_back("95");
  82. dv3->push_back("lalala");
  83. dv3->push_back("45");
  84. dv3->show();
  85. return 0;
  86. }

晚上完善 增加了 删 改 查

  1. - 和尹成老师视频里面写的不一样。。自己写的。反正就是不规范就是了
  • dvector.h
  1. #ifndef DVECTOR_H
  2. #define DVECTOR_H
  3. #pragma once
  4. #include <iostream>
  5. template <class T>
  6. class dvector
  7. {
  8. public:
  9. dvector();
  10. ~dvector();
  11. bool push_back(T);
  12. bool del(T);
  13. bool modify(T, T);
  14. int search(T t);
  15. void show();
  16. public:
  17. T* p;
  18. int len;
  19. int real_len;
  20. };
  21. #endif // DVECTOR_H
  • dvector.cpp
  1. #include "dvector.h"
  2. using namespace std;
  3. template <class T>
  4. dvector<T>::dvector()
  5. {
  6. len=real_len =0;
  7. p=nullptr;
  8. }
  9. template<class T>
  10. dvector<T>::~dvector()
  11. {
  12. if(p!=nullptr)
  13. {
  14. delete []p;
  15. p=nullptr;
  16. }
  17. }
  18. //遍历输出
  19. template <class T>
  20. void dvector<T>::show()
  21. {
  22. if(p!=nullptr)
  23. {
  24. for(int i=0;i<real_len;i++){
  25. std::cout<<i<<"\t"<<*(p+i)<<std::endl;
  26. }
  27. std::cout<<"length="<<real_len<<std::endl;
  28. }else {
  29. std::cout<<"NNNNNNNNNNNNNNNNNNNNNNNNNNo thing"<<std::endl;
  30. }
  31. }
  32. //增
  33. template<class T>
  34. bool dvector<T>::push_back(T t){
  35. if(p==nullptr)
  36. {
  37. //第一个为空说明只有一个元素
  38. p=new T;
  39. *p=t;
  40. real_len=len=1;
  41. }else {
  42. //第一个不为空说明有多个元素,这时候链表就必须重新分配内存
  43. //分配为数组形式
  44. T *ptemp = new T[real_len+1];
  45. for(int i=0;i<real_len;i++)
  46. {
  47. *(ptemp+i)=*(p+i);
  48. }
  49. *(ptemp+real_len)=t;
  50. delete []p;
  51. p=ptemp;
  52. real_len+=1;
  53. len+=1;
  54. }
  55. return true;
  56. }
  57. //查 返回查找到的序号
  58. template <class T>
  59. int dvector<T>::search(T t)
  60. {
  61. if (p ==nullptr)
  62. {
  63. std::cout << "The dvector is empty ,abort!" << std::endl;
  64. return false;
  65. }
  66. else
  67. {
  68. for (size_t i = 0; i < real_len; i++)
  69. {
  70. if (*(p+i) == t)
  71. {
  72. cout << "FIND " << t << "at the position of " << i<<" " << endl;
  73. return i;
  74. }
  75. }
  76. cout << "no such a thing" << endl;
  77. return -1;
  78. }
  79. return -1;
  80. }
  81. //删
  82. template <class T>
  83. bool dvector<T>::del(T t)
  84. {
  85. if (p == nullptr)
  86. {
  87. std::cout << "The dvector is alreafy empty ,abort!" << std::endl;
  88. return false;
  89. }
  90. else
  91. {
  92. for (size_t i = 0; i < real_len; i++)
  93. {
  94. if (*(p + i) == t)
  95. {
  96. cout << "Deleting" << endl;
  97. cout << "FIND " << t << "at the position of " << i << " " << endl;
  98. //如果是在第一个的情况
  99. if (i == 0)
  100. {
  101. for (size_t i = 0; i < real_len; i++)
  102. {
  103. if (real_len == 1) //如果是只剩一个而且刚好第一个是要删除的
  104. {
  105. delete p;
  106. p == nullptr;
  107. real_len -= 1;
  108. return true;
  109. }
  110. else
  111. { //还有多个且第一个是要删除的
  112. T* tmp = new T[real_len - 1];
  113. for (size_t k = 0; k < real_len-1; k++)
  114. {
  115. *(tmp + k) = *(p + k + 1);
  116. }
  117. delete[]p;
  118. p = tmp;
  119. real_len -= 1;
  120. return true;
  121. }
  122. }
  123. }
  124. else if (i== real_len-1) //最后一个匹配要删除的时候
  125. {
  126. p + i == nullptr;
  127. real_len -= 1;
  128. }
  129. else //在中间的情况
  130. {
  131. T* tmp = new T[real_len - 1];
  132. for (size_t k = 0; k < i ; k++)
  133. {
  134. *(tmp + k) = *(p + k);
  135. }
  136. // 利用两个循环刚好跳过下标为i 的值 k 为原来的p 中的值,tmp+k-i 为新数组中的下标
  137. for (size_t k = i+1; k < real_len; k++)
  138. {
  139. *(tmp + k - 1) = *(p + k);
  140. }
  141. delete[]p;
  142. p = tmp;
  143. real_len -= 1;
  144. return true;
  145. }
  146. }
  147. }
  148. cout << "no such a thing,Delete failed!" << endl;
  149. return false;
  150. }
  151. }
  152. //改
  153. template <class T>
  154. bool dvector<T>::modify(T origin, T mo)
  155. {
  156. if (p == nullptr)
  157. {
  158. std::cout << "The dvector is empty ,abort!" << std::endl;
  159. return false;
  160. }
  161. else
  162. {
  163. for (size_t i = 0; i < real_len; i++)
  164. {
  165. if (*(p + i) == origin)
  166. {
  167. cout << "Modifying" << endl;
  168. cout << "FIND " << origin << "at the position of " << i << " " << endl;
  169. *(p + i) = mo;
  170. }
  171. }
  172. cout << "no such a thing ,Modify failed!" << endl;
  173. return false;
  174. }
  175. return -1;
  176. }
  177. int main()
  178. {
  179. //测试基本类型
  180. //string 会出错,因为string 不是基本类型,是一种类似 vector 的类模板,其内部的内存操作与基本类型不一样。
  181. //1. int
  182. dvector<int>* dv1=new dvector<int>;
  183. dv1->push_back(12);
  184. dv1->push_back(15);
  185. dv1->push_back(1995);
  186. dv1->push_back(200);
  187. dv1->push_back(2);
  188. dv1->push_back(1);
  189. dv1->show();
  190. //dv1->search(200);
  191. //dv1->search(1000);
  192. dv1->del(12);
  193. dv1->show();
  194. dv1->del(1995);
  195. dv1->show();
  196. dv1->del(1);
  197. dv1->show();
  198. dv1->modify(15, 33);
  199. dv1->modify(200, 1);
  200. dv1->modify(100, 1);
  201. dv1->show();
  202. // cout<<"next............"<<endl<<endl;
  203. // //2. double
  204. // dvector<double>* dv2=new dvector<double>;
  205. // dv2->push_back(12.2);
  206. // dv2->push_back(15.3);
  207. // dv2->push_back(1995.0220);
  208. // dv2->push_back(200.1);
  209. // dv2->push_back(2.3);
  210. // dv2->push_back(1.9);
  211. //
  212. // dv2->show();
  213. //
  214. // dv2->search(1.9);
  215. //
  216. // cout << "next............" << endl << endl;
  217. //
  218. // //3. char*
  219. // dvector<const char*>* dv3=new dvector<const char*>;
  220. // dv3->push_back("nimei");
  221. // dv3->push_back("de");
  222. // dv3->push_back("垃圾");
  223. // dv3->push_back("95");
  224. // dv3->push_back("lalala");
  225. // dv3->push_back("45");
  226. //
  227. //dv3->show();
  228. //dv3->search("nimei");
  229. //cout << "next............" << endl << endl;
  230. std::cin.get();
  231. return 0;
  232. }

一个自己实现的Vector 完善版本的更多相关文章

  1. 给WPF示例图形加上方便查看大小的格子之完善版本

    原文:给WPF示例图形加上方便查看大小的格子之完善版本 去年10月份, 我曾写过一篇"给WPF示例图形加上方便查看大小的格子"的BLOG(http://blog.csdn.net/ ...

  2. 一个自己实现的Vector(只能处理基本类型数据)

    一个自己实现的Vector(只能处理基本类型数据) string 类型不行 bool char* int double float long long 等基本s类型可用 使用模板类实现.底层为数组实现 ...

  3. iOS----友盟分享完善版本

    分享 详细集成 注意:1.线上集成文档的示例代码对应的是最新版本的SDK,如果你所用的SDK版本类名或者方法名与此文档不符合,请看随包里面的线下文档或者下载使用最新版本的SDK. 设置友盟appkey ...

  4. Virtualenv: 一个Python环境管理工具(windown版本)

    1.安装virtualenv 在安装virtualenv之前,我们需要安装至少有一个版本的python:因为virtualenv是python的一个第三方模块,必须基于python环境才能安装: 如果 ...

  5. 一个fork短码的扩展版本

    原本代码: 链接 int skip = !!fork() + 2*(!!fork()); for (uint32_t i=skip;i!=INT_MAX;i+=4) { } 这个是多进程加速循环的代码 ...

  6. HttpDNS的坑以及一个针对安卓不太完善的测试方案

    背景:单位因为域名劫持(具体表象是某个地区的用户ping不通域名或者因为DNS解析的ip跨网段导致访问速度很慢)需要运维经常去定位,于是提出了httpDNS方案. 想法是美好的,现实是残酷的.没引入这 ...

  7. 一个suse11 sp1的crash工具版本问题

    这几年排查的各种类型的crash也比较多了,各种类型的也算见过,但是排查这个crash,走了不该走的弯路,事后显得很low,为了防止自己犯类似错误,也同时提醒后人,记录之. 内核是suse11,sp1 ...

  8. 一个linux内核模块移植到低版本时发生的异常

    在3.10的内核版本下,有一个运行稳定的内核模块,移植到suse11的时候,编译正常,运行则直接出现crash: <>[ <>[ 503.347300] Modules lin ...

  9. 用.netcore写一个简单redis驱动,调试windows版本的redis.平且给set和get命令添加参数.

    1. 下载windows版本的redis 2.开发环境vs2017  新建一个 .net core控制台. private static Socket socket = new Socket(Addr ...

随机推荐

  1. [转]Java监听器的原理与实现

    原文链接 监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其实就是一个实现特定接口的普通java程序,这个程序专门用 ...

  2. 【转】spring IOC和AOP的理解

    spring 的优点?1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实 ...

  3. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 排版:使段落突出显示

    <!DOCTYPE html> <html> <head> <title>菜鸟教程(runoob.com)</title> <meta ...

  4. Java 常用转换

    日期转换 SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = ft.par ...

  5. highcharts Ajax 动态请求加载数据

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  6. redhat 7.6 安装 inotify-tools 文件监控工具 搭配rsync

    1.解压inotify-tools tar -zxvpf inotify-tools-3.14.tar.gz 2.cd 到解压的目录 3../configure  编译,然后失败,提示checking ...

  7. Java 在Excel单元格中应用一种/多种字体样式

    在Excel表格中,设置单元格字体样式时,可以对单元格内的所有字符应用同一样式,即获取指定单元,应用样式即可:另外也可以对单元格内的不同字符内容应用不同字体样式,即获取单元格中的字符位置,应用样式:本 ...

  8. 浅谈PHP组件、框架以及Composer

    本篇文章主要介绍了PHP组件.框架以及Composer,具有一定的学习价值,感兴趣的朋友可以了解一下. 什么是组件 组件是一组打包的代码,是一系列相关的类.接口和Trait,用于帮助我们解决PHP应用 ...

  9. 133、Java获取main主函数参数

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  10. 113、Java中String类之字符串文本分割IP地址

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...