vector.h:

  1. #ifndef __Vector__H__
  2. #define __Vector__H__
  3. typedef int Rank;
  4. #define DEFAULT_CAPACITY 3
  5.  
  6. template<typename T> class Vector{
  7. protected:
  8. Rank _size; int _capacity; T*_elem;
  9. void copyFrom(T const *A, Rank lo, Rank hi);
  10. void expand();
  11. void shrink();
  12. void bubbleSort(Rank lo,Rank hi);
  13. bool bubble(Rank lo,Rank hi);
  14. void mergeSort(Rank lo,Rank hi);
  15. void merge(Rank lo,Rank mi,Rank hi);
  16. public:
  17. Vector(int c = DEFAULT_CAPACITY,int s = 0, T v = 0)
  18. {
  19. _elem = new T[_capacity = s];
  20. for (_size = 0; _size < s; _elem[_size++] = v);
  21. }
  22. Vector(T const *A, Rank n) { copyFrom(A, 0, n); }
  23. Vector(T const *A, Rank lo, Rank hi) { copyFrom(A, lo, hi); }
  24. Vector(Vector<T> const &V) { copyFrom(V._elem,0,V._size); }
  25. Vector(Vector<T> const &V, Rank lo, Rank hi) { copyFrom(V._elem, lo, hi);}
  26. ~Vector(){delete[]_elem;}
  27.  
  28. Rank size() const { return _size;}
  29. bool empty() const { return !_size;}
  30. Vector<T>& operator=(Vector<T> const&);
  31.  
  32. T&operator[](Rank r) const;
  33.  
  34. void unsort(Rank lo,Rank hi);
  35. Rank find(T const& e,Rank lo,Rank hi) const;
  36. Rank insert(Rank r,T const& e);
  37. int remove(Rank lo,Rank hi);
  38. T remove(Rank r);
  39. int deduplicate();
  40. int disordered() const;
  41.  
  42. int uniquify();
  43.  
  44. void traverse(void(*)(T&));
  45. template<typename VST> void traverse(VST&);
  46.  
  47. static Rank binSearch(T* A,T const& e,Rank lo,Rank hi);
  48. static Rank binSearch2(T* A, T const& e, Rank lo, Rank hi);
  49. static Rank binSearch3(T* A, T const& e, Rank lo, Rank hi);
  50. };
  51. #endif

vector.cpp:

  1. #include"Vector.h"
  2. template<typename T>
  3. void Vector<T>::copyFrom(T const * A, Rank lo, Rank hi)
  4. {
  5. _elem = new T[_capacity=2*(hi-lo)];
  6. _size = 0;
  7. while (lo < hi)
  8. {
  9. _elem[_size++] = A[lo++];
  10. }
  11. }
  12.  
  13. template<typename T>
  14. void Vector<T>::expand()
  15. {
  16. if (_size < _capacity)return;
  17. if (_capacity < DEFAULT_CAPACITY) { _capacity = DEFAULT_CAPACITY; }
  18. T*oldElem = _elem;
  19. _elem = new T[_capacity<<=1];
  20. for (int i = 0; i < _size; i++)
  21. {
  22. _elem[i] = oldElem[i];
  23. }
  24. delete[]oldElem;
  25. }
  26.  
  27. template<typename T>
  28. void Vector<T>::shrink()
  29. {
  30. if (_capacity < DEFAULT_CAPACITY << 1)return;
  31. if (_size << 2 > _capacity)return;
  32. T *oldElem = _elem;
  33. _elem = new T[_capacity>>=1];
  34. for(int i = 0; i < _size; i++)
  35. {
  36. _elem[i] = oldElem[i];
  37. }
  38. delete[]oldElem;
  39. }
  40.  
  41. template<typename T>
  42. void Vector<T>::bubbleSort(Rank lo, Rank hi)
  43. {
  44. while (!bubble(lo,hi--));
  45. }
  46.  
  47. template<typename T>
  48. bool Vector<T>::bubble(Rank lo, Rank hi)
  49. {
  50. bool sorted = true;
  51. while (++lo < hi)
  52. {
  53. if(_elem[lo - 1] < _elem[lo])
  54. {
  55. sorted = false;
  56. swap(_elem[lo-1],_elem[lo]);
  57. }
  58. }
  59. return sorted;
  60. }
  61.  
  62. template<typename T>
  63. void Vector<T>::mergeSort(Rank lo, Rank hi)
  64. {
  65. if (hi - lo < 2) return;
  66. int mi = (lo + hi) / 2;
  67. mergeSort(lo,mi);
  68. mergeSort(mi,hi);
  69. merge(lo,mi,hi);
  70. }
  71.  
  72. template<typename T>
  73. void Vector<T>::merge(Rank lo, Rank mi,Rank hi)
  74. {
  75. T *A = _elem + lo;
  76. int lb = mi - lo;
  77. T* B = new T[lb];
  78. for (int i = 0; i < lb; i++) B[i] = A[i];
  79. int rb = hi - mi;
  80. T *C = _elem + mi;
  81. for (Rank i=0,int j = 0, int k = 0; (j < lb) || (k < rb);)
  82. {
  83. if ((j<lb)&&(k>rb||(B[j] < C[k])))
  84. {
  85. A[i++] = B[j++];
  86. }
  87. if ((k<rb)&&(j>lb||(C[k]<=B[j])))

  88. A[i++] = C[k++];

  89. }
  90. delete[] B;
  91.  
  92. }
  93.  
  94. template<typename T>
  95. Vector<T>& Vector<T>::operator=(Vector<T> const & V)
  96. {
  97. if (_elem) delete[]_elem;
  98. copyFrom(V._elem,0,V._size);
  99. return *this;
  100. }
  101.  
  102. template<typename T>
  103. T & Vector<T>::operator[](Rank r) const
  104. {
  105. return _elem[r];
  106. }
  107.  
  108. template<typename T>
  109. void Vector<T>::unsort(Rank lo, Rank hi)
  110. {
  111. T* V = _elem + lo;
  112. for(Rank i = hi - lo; i >= 0; i--)
  113. {
  114. swap(V[i-1] = V[rand()%i]);
  115. }
  116. }
  117.  
  118. template<typename T>
  119. Rank Vector<T>::find(T const & e, Rank lo, Rank hi) const
  120. {
  121. while((lo < hi--)&&(e!=_elem[hi]));
  122. return hi;
  123. }
  124.  
  125. template<typename T>
  126. Rank Vector<T>::insert(Rank r, T const & e)
  127. {
  128. expand();
  129. for (int i = _size; i > r; i--)
  130. {
  131. _elem[i] = _elem[i-1];
  132. }
  133. _elem[r] = e;
  134. _size++;
  135. return r;
  136. }
  137.  
  138. template<typename T>
  139. int Vector<T>::remove(Rank lo, Rank hi)
  140. {
  141. if (lo == hi)return 0;
  142. while (hi < _size)
  143. {
  144. _elem[lo++] = _elem[hi++];
  145. }
  146. _size = lo;
  147. shrink();
  148. return hi - lo;
  149. }
  150.  
  151. template<typename T>
  152. T Vector<T>::remove(Rank r)
  153. {
  154. T e = _elem[r];
  155. remove(r,r+1);
  156. return e;
  157. }
  158.  
  159. template<typename T>
  160. int Vector<T>::deduplicate()
  161. {
  162. int oldsize = _size;
  163. Rank i = 1;
  164. while (i < _size)
  165. {
  166. (find(_elem[i], 0, _size) < 0) ? i++ : remove(i);
  167. }
  168.  
  169. return oldsize-_size;
  170.  
  171. }
  172.  
  173. template<typename T>
  174. int Vector<T>::disordered() const
  175. {
  176. int n = 0;
  177. for (int i = 1; i < _size; i++)
  178. {
  179. if(_elem[i - 1] > _elem[i])
  180. {
  181. n++;
  182. }
  183. }
  184. return n;
  185. }
  186.  
  187. template<typename T>
  188. int Vector<T>::uniquify()
  189. {
  190. Rank i = 0, j = 0;
  191. while (++j < _size)
  192. {
  193. if (_elem[i] != _elem[j])
  194. {
  195. _elem[++i] = _elem[j];
  196. }
  197. }
  198. _size = ++i;
  199. shrink();
  200. return j - i;
  201. }
  202.  
  203. template<typename T>
  204. Rank Vector<T>::binSearch(T * A, T const & e, Rank lo, Rank hi)
  205. {
  206. while (lo < hi)
  207. {
  208. Rank mi = (lo + hi) >> 1;
  209. if (e > A[mi])
  210. {
  211. lo = mi+1;
  212. }
  213. else if (e < A[mi])
  214. {
  215. hi = mi;
  216. }
  217. else {
  218. return mi;
  219. }
  220. }
  221. return -1;
  222. }
  223.  
  224. template<typename T>
  225. Rank Vector<T>::binSearch2(T * A, T const & e, Rank lo, Rank hi)
  226. {
  227. while (1 < (hi - lo))
  228. {
  229. Rank mi = (lo + hi) >> 1;
  230. (e < A[mi]) ? hi = mi : lo = mi;
  231. }
  232. return (e == A[lo]) ? lo : -1;
  233. }
  234.  
  235. template<typename T>
  236. Rank Vector<T>::binSearch3(T * A, T const & e, Rank lo, Rank hi)
  237. {
  238. while (lo < hi)
  239. {
  240. Rank mi = (lo + hi) >> 1;
  241. (e < A[mi]) ? hi = mi : lo = mi + 1;
  242. }
  243. return --lo;
  244. }
  245.  
  246. template<typename T>
  247. void Vector<T>::traverse(void(*visit)(T &))
  248. {
  249. for (int i = 0; i < _size; i++)
  250. {
  251. visit(_elem[i]);
  252. }
  253. }
  254.  
  255. template<typename T>
  256. template<typename VST>
  257. void Vector<T>::traverse(VST &visit)
  258. {
  259. for (int i = 0; i < _size; i++)
  260. {
  261. visit(_elem[i]);
  262. }
  263. }

vector自实现(一)的更多相关文章

  1. c++ vector 使用

    1. 包含一个头文件: 1 #include <vector> 2. 申明及初始化: std::vector<int> first; // empty vector of in ...

  2. Vector Tile

    Mapbox Vector Tile Specification A specification for encoding tiled vector data. <?XML:NAMESPACE ...

  3. ArrayList、Vector、LinkedList的区别联系?

    1.ArrayList.Vector.LinkedList类都是java.util包中,均为可伸缩数组. 2.ArrayList和Vector底层都是数组实现的,所以,索引数据快,删除.插入数据慢. ...

  4. ArrayList、Vector、HashMap、HashSet的默认初始容量、加载因子、扩容增量

    当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使效率大大降低. 加载因 ...

  5. Java中Vector和ArrayList的区别

    首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList.Vector和LinkedList.List用于存放多个元素,能够维护元素的次序,并且允许元素的重复.3个具体 ...

  6. C++使用vector

    #include <iostream> #include <string> #include <vector> using namespace std; void ...

  7. [LeetCode] Flatten 2D Vector 压平二维向量

    Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [1,2], [3], [4,5,6] ] ...

  8. C++ 数组array与vector的比较

    转:http://blog.csdn.net/yukin_xue/article/details/7391897 1. array 定义的时候必须定义数组的元素个数;而vector 不需要: 且只能包 ...

  9. vector定义初始化

    头文件 #include<vector> using std::vector; vector<T> v1; vector<T> v2(v1); vector< ...

  10. vector迭代器用法

    #include<iostream> #include<vector> using namespace std; int main() { vector<int> ...

随机推荐

  1. win10 1909+ vs2015up3 使用fmt概述(fmt version 7.0.1)

    !!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist fmt 源码: https://github.com/fmtlib/fmt fmt官方文档: ...

  2. 使用.NET 6开发TodoList应用(9)——实现PUT请求

    系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 PUT请求本身其实可说的并不多,过程也和创建基本类似.在这篇文章中,重点是填上之前文章里留的一个坑,我们曾经给TodoItem ...

  3. Chapter 6 Graphical Representation of Causal Effects

    目录 6.1 Causal diagrams 6.2 Causal diagrams and marginal independence 6.3 Causal diagrams and conditi ...

  4. [Xavier] Understanding the difficulty of training deep feedforward neural networks

    目录 概 主要内容 Glorot X, Bengio Y. Understanding the difficulty of training deep feedforward neural netwo ...

  5. 使用.NET 6开发TodoList应用(14)——实现查询过滤

    系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 在查询请求中,还有一类常见的场景是过滤查询,也就是有限制条件的查询,落在数据库层面就是常用的Where查询子句.实现起来也很简 ...

  6. 基于Java swing+mysql+eclipse的【图书管理系统】

    本项目为Java swing项目,在工作环境中基本使用不到,但是很多学校把这个当做编程入门的项目来做,故分享出本项目供初学者参考. CSDN赞助下载:https://download.csdn.net ...

  7. 编写Java程序,实现字符串统计和处理

    返回本章节 返回作业目录 需求说明: 在控制台输入纯字符的字符串,输出当前字符串的长度. 统计出该字符串中出现相同字母次数最多的字母(不考虑不同字母出现次数相同的情况). 将出现最多次数的字母字母替换 ...

  8. .net core的配置介绍(三):Options

    前两篇介绍的都是已IConfiguration为基础的配置,这里在说说.net core提供的一种全新的辅助配置机制:Options. Options,翻译成中文就是选项,可选择的意思,它依赖于.ne ...

  9. nexus私服SNAPSHOT仓库maven-metadata.xml缺失导致的Could not find artifact:***.jar

    环境:maven项目,使用Nexus私服(ip:192.168.10.100),jenkins实现代码的编译和打包. 问题分析思路:在2021年元旦假期前,jenkins上的编译打包任务一直正常工作, ...

  10. ORACLE 之 按月循环执行操作

    DECLARE i number; BEGIN i:= 201705; WHILE i <202104 LOOP if i=201713 then i:=201801; elsif i=2018 ...