用了双向链表,快排,<<,=,[]重载,还有erase的实现比较好玩

  1. //my Vecter ;T need "operator<"
  2.  
  3. #include <iostream>
  4. using std::cout;
  5. using std::ostream;
  6.  
  7. template <typename T>
  8. struct item
  9. {
  10. item():value(),next(NULL),last(NULL){}
  11. item(const T t):value(t),next(NULL),last(NULL){}
  12. item *next,*last;
  13. T value;
  14. };
  15.  
  16. template <typename T>
  17. class Vector
  18. {
  19. public:
  20. Vector():m_size(),m_head(NULL){}
  21. int size() const{return m_size;}
  22. bool empty() const{return m_size?true:false;}
  23. T front() const{return m_size?m_head->value:T();}
  24. T back() const{return m_size?end()->value:T();}
  25. bool push_back(const T&);
  26. bool push_front(const T&);
  27. T pop_back();
  28. T pop_front();
  29. void erase(int pos,int num);
  30. void clear();
  31. T& operator[](const int key);
  32. void sort();
  33. Vector<T>& operator=(Vector<T>& v);
  34.  
  35. private:
  36. item<T> * end() const;
  37. int m_size;
  38. item<T> *m_head;
  39. int partition(int,int);
  40. void qsort(int,int);
  41. };
  42.  
  43. template <typename T>
  44. bool Vector<T>::push_back(const T& t)
  45. {
  46. if(m_size==)
  47. {
  48. m_head=new item<T>;
  49. m_head->value=t;
  50. }
  51. else
  52. {
  53. item<T>* save=end();
  54. save->next=new item<T>(t);
  55. save->next->last=save;
  56. }
  57. m_size++;
  58. return true;
  59. }
  60.  
  61. template <typename T>
  62. bool Vector<T>::push_front(const T& t)
  63. {
  64. if(m_size==)
  65. {
  66. m_head=new item<T>(t);
  67. return true;
  68. }
  69. item<T> *save=m_head;
  70. m_head=new item<T>(t);
  71. m_head->next=save;
  72. m_size++;
  73. if(save!=NULL)save->last=m_head;
  74. return true;
  75. }
  76.  
  77. template <typename T>
  78. T Vector<T>::pop_front()
  79. {
  80. if(m_size==)return T();
  81. if(m_size==)
  82. {
  83. T t=m_head->value;
  84. delete m_head;
  85. m_head=NULL;
  86. m_size--;
  87. return t;
  88. }
  89. item<T>* save=m_head->next;
  90. T t=m_head->value;
  91. delete m_head;
  92. m_head=save;
  93. save->last=m_head;
  94. m_size--;
  95. return t;
  96. }
  97.  
  98. template <typename T>
  99. T Vector<T>::pop_back()
  100. {
  101. if(m_size==)return T();
  102. if(m_size==)
  103. {
  104. T t=m_head->value;
  105. delete m_head;
  106. m_head=NULL;
  107. m_size--;
  108. return t;
  109. }
  110. item<T>* e=end();
  111. T t=e->value;
  112. e->last->next=NULL;
  113. delete e;
  114. m_size--;
  115. return t;
  116. }
  117.  
  118. template <typename T>
  119. void Vector<T>::erase(int pos,int num)
  120. {
  121. if(m_size<pos+)return;
  122. else
  123. {
  124. item<T> *p=m_head,*save;
  125. for(int i=;i<pos;i++){p=p->next;}
  126. for(int i=;i<num;i++)
  127. {
  128. if(p==NULL)break;
  129. save=p;
  130. if(p->last==NULL){m_head=p->next;}
  131. else p->last->next=p->next;
  132. if(p->next!=NULL)p->next->last=p->last;
  133. p=p->next;
  134. delete save;
  135. m_size--;
  136. }
  137. }
  138. }
  139.  
  140. template <typename T>
  141. T& Vector<T>::operator[](const int key)
  142. {
  143. if(key+>m_size)m_size=(key+);
  144. item<T> *p=m_head,*save;
  145. for(int i=;i<key+;i++)
  146. {
  147. if(m_head==NULL)
  148. {
  149. m_head=new item<T>;
  150. save=p=m_head;
  151. }
  152. else if(p==NULL)
  153. {
  154. p=new item<T>;
  155. p->last=save;
  156. save->next=p;
  157. }
  158. save=p;
  159. p=p->next;
  160. }
  161. return save->value;
  162. }
  163.  
  164. template <typename T>
  165. void Vector<T>::clear()
  166. {
  167. erase(,m_size);
  168. }
  169.  
  170. template <typename T>
  171. item<T>* Vector<T>::end() const
  172. {
  173. if(m_size==)return NULL;
  174. item<T> *p=m_head;
  175. for(; p->next!=NULL; p=p->next);
  176. return p;
  177. }
  178.  
  179. template <typename T>
  180. int Vector<T>::partition(int p,int r)
  181. {
  182. T x=(*this)[r];
  183. int i=p-;T temp;
  184. for(int j=p;j<=r-;j++)
  185. {
  186. if((*this)[j]<x)
  187. {
  188. i++;
  189. if(i!=j)
  190. {temp=(*this)[i];(*this)[i]=(*this)[j];(*this)[j]=temp;}
  191. }
  192. }
  193. if(r!=i+)
  194. {temp=(*this)[r];(*this)[r]=(*this)[i+];(*this)[i+]=temp;}
  195. return i+;
  196. }
  197.  
  198. template <typename T>
  199. void Vector<T>::sort()
  200. {
  201. qsort(,m_size-);
  202. }
  203. template <typename T>
  204. void Vector<T>::qsort(int p,int r)
  205. {
  206. if(p<r)
  207. {
  208. int q=partition(p,r);
  209. qsort(p,q-);
  210. qsort(q+,r);
  211. }
  212. }
  213.  
  214. template<typename T>
  215. ostream& operator<<(ostream& out,Vector<T> &v)
  216. {
  217. for(int i=;i<v.size();i++)
  218. {
  219. out<<v[i]<<" ";
  220. }
  221. return out;
  222. }
  223. template<typename T>
  224. Vector<T>& Vector<T>::operator=(Vector& v)
  225. {
  226. this->clear();
  227. m_size=v.m_size;
  228. item<T> *p=m_head,*vp=v.m_head;
  229. for(int i=;i<m_size;i++)
  230. {
  231. p=new item<T>(vp->value);
  232. p=p->next;
  233. vp=vp->next;
  234. }
  235. return *this;
  236. }
  237.  
  238. int main()
  239. {
  240. int i=;
  241. Vector<int> v;
  242. v.push_back(i);i--;
  243. v.push_front(i);
  244. v.push_back(i);i--;
  245. v.push_front(i);
  246. v[]=;
  247. cout<<v<<"\n";
  248. v.erase(,);
  249. cout<<v<<"\n";
  250. v.clear();
  251. for(int i=;i>;i--)v[i]=-i;
  252. v[]=;
  253. v[]=;
  254. cout<<v<<"\n";
  255. v.sort();
  256. cout<<"V1= "<<v<<"\n";
  257. Vector<int> v2=v;
  258. cout<<"V2= "<<v2<<"\n";
  259. return ;
  260. }

C++实现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. Like与Instr模糊查询性能

    项目中用到like模糊查询,但是总觉的太小家子气,有没有高逼格的呢? instr(title,'手册')>0 相当于 title like '%手册%' instr(title,'手册')=1 ...

  2. NOSDK--一键打包的实现(二)

    Android.mk文件,位置在android工程/jni目录下,是android工程中的makefile文件,这里我们简称它为mk文件. 1.2 自动刷新mk文件的脚本介绍 这一节介绍mk文件的自动 ...

  3. [Data Structure & Algorithm] 八大排序算法

    排序有内部排序和外部排序之分,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.我们这里说的八大排序算法均为内部排序. 下图为排序 ...

  4. 【MySQL】Create table 以及 foreign key 删表顺序考究。

    1.以下是直接从数据库导出的建表语句. 1 -- ---------------------------- 2 -- Table structure for files 3 -- ---------- ...

  5. 翻译:打造Edge渲染内核的浏览器

    最近开始了解UWP和Edge内核,在微软技术博客中找到一篇文章,主要是介绍Edge渲染内核使用技术.顺手翻译了一下.不对之处请斧正! Over the past several months, we ...

  6. MySQL 5.7 学习:安全相关特性

    背景: 继上次介绍 初识 MySQL 5.6 新功能.参数完之后,刚好MySQL 5.7又GA了,在官方测试里看到,MySQL5.7在功能.性能.可用性.安全和监控上又提升了很高.现在看看和MySQL ...

  7. myeclipse6.5注册机

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public ...

  8. Sublime Text 2 增加python版本

    当系统中装有多个python版本时,Sublime Text 2  使用哪个版本需要手动添加 键入一下内容,path输入python的安转路径 保存至Python27.sublime-build文件 ...

  9. CSS3颜色渐变模式

       1.线性渐变:linear-gradient 语法:<linear-gradient> = linear-gradient([ [ <angle> | to <si ...

  10. 【翻译】ASP.NET MVC 5属性路由(转)

    转载链接:http://www.cnblogs.com/thestartdream/p/4246533.html 原文链接:http://blogs.msdn.com/b/webdev/archive ...