C++实现vector
用了双向链表,快排,<<,=,[]重载,还有erase的实现比较好玩
- //my Vecter ;T need "operator<"
- #include <iostream>
- using std::cout;
- using std::ostream;
- template <typename T>
- struct item
- {
- item():value(),next(NULL),last(NULL){}
- item(const T t):value(t),next(NULL),last(NULL){}
- item *next,*last;
- T value;
- };
- template <typename T>
- class Vector
- {
- public:
- Vector():m_size(),m_head(NULL){}
- int size() const{return m_size;}
- bool empty() const{return m_size?true:false;}
- T front() const{return m_size?m_head->value:T();}
- T back() const{return m_size?end()->value:T();}
- bool push_back(const T&);
- bool push_front(const T&);
- T pop_back();
- T pop_front();
- void erase(int pos,int num);
- void clear();
- T& operator[](const int key);
- void sort();
- Vector<T>& operator=(Vector<T>& v);
- private:
- item<T> * end() const;
- int m_size;
- item<T> *m_head;
- int partition(int,int);
- void qsort(int,int);
- };
- template <typename T>
- bool Vector<T>::push_back(const T& t)
- {
- if(m_size==)
- {
- m_head=new item<T>;
- m_head->value=t;
- }
- else
- {
- item<T>* save=end();
- save->next=new item<T>(t);
- save->next->last=save;
- }
- m_size++;
- return true;
- }
- template <typename T>
- bool Vector<T>::push_front(const T& t)
- {
- if(m_size==)
- {
- m_head=new item<T>(t);
- return true;
- }
- item<T> *save=m_head;
- m_head=new item<T>(t);
- m_head->next=save;
- m_size++;
- if(save!=NULL)save->last=m_head;
- return true;
- }
- template <typename T>
- T Vector<T>::pop_front()
- {
- if(m_size==)return T();
- if(m_size==)
- {
- T t=m_head->value;
- delete m_head;
- m_head=NULL;
- m_size--;
- return t;
- }
- item<T>* save=m_head->next;
- T t=m_head->value;
- delete m_head;
- m_head=save;
- save->last=m_head;
- m_size--;
- return t;
- }
- template <typename T>
- T Vector<T>::pop_back()
- {
- if(m_size==)return T();
- if(m_size==)
- {
- T t=m_head->value;
- delete m_head;
- m_head=NULL;
- m_size--;
- return t;
- }
- item<T>* e=end();
- T t=e->value;
- e->last->next=NULL;
- delete e;
- m_size--;
- return t;
- }
- template <typename T>
- void Vector<T>::erase(int pos,int num)
- {
- if(m_size<pos+)return;
- else
- {
- item<T> *p=m_head,*save;
- for(int i=;i<pos;i++){p=p->next;}
- for(int i=;i<num;i++)
- {
- if(p==NULL)break;
- save=p;
- if(p->last==NULL){m_head=p->next;}
- else p->last->next=p->next;
- if(p->next!=NULL)p->next->last=p->last;
- p=p->next;
- delete save;
- m_size--;
- }
- }
- }
- template <typename T>
- T& Vector<T>::operator[](const int key)
- {
- if(key+>m_size)m_size=(key+);
- item<T> *p=m_head,*save;
- for(int i=;i<key+;i++)
- {
- if(m_head==NULL)
- {
- m_head=new item<T>;
- save=p=m_head;
- }
- else if(p==NULL)
- {
- p=new item<T>;
- p->last=save;
- save->next=p;
- }
- save=p;
- p=p->next;
- }
- return save->value;
- }
- template <typename T>
- void Vector<T>::clear()
- {
- erase(,m_size);
- }
- template <typename T>
- item<T>* Vector<T>::end() const
- {
- if(m_size==)return NULL;
- item<T> *p=m_head;
- for(; p->next!=NULL; p=p->next);
- return p;
- }
- template <typename T>
- int Vector<T>::partition(int p,int r)
- {
- T x=(*this)[r];
- int i=p-;T temp;
- for(int j=p;j<=r-;j++)
- {
- if((*this)[j]<x)
- {
- i++;
- if(i!=j)
- {temp=(*this)[i];(*this)[i]=(*this)[j];(*this)[j]=temp;}
- }
- }
- if(r!=i+)
- {temp=(*this)[r];(*this)[r]=(*this)[i+];(*this)[i+]=temp;}
- return i+;
- }
- template <typename T>
- void Vector<T>::sort()
- {
- qsort(,m_size-);
- }
- template <typename T>
- void Vector<T>::qsort(int p,int r)
- {
- if(p<r)
- {
- int q=partition(p,r);
- qsort(p,q-);
- qsort(q+,r);
- }
- }
- template<typename T>
- ostream& operator<<(ostream& out,Vector<T> &v)
- {
- for(int i=;i<v.size();i++)
- {
- out<<v[i]<<" ";
- }
- return out;
- }
- template<typename T>
- Vector<T>& Vector<T>::operator=(Vector& v)
- {
- this->clear();
- m_size=v.m_size;
- item<T> *p=m_head,*vp=v.m_head;
- for(int i=;i<m_size;i++)
- {
- p=new item<T>(vp->value);
- p=p->next;
- vp=vp->next;
- }
- return *this;
- }
- int main()
- {
- int i=;
- Vector<int> v;
- v.push_back(i);i--;
- v.push_front(i);
- v.push_back(i);i--;
- v.push_front(i);
- v[]=;
- cout<<v<<"\n";
- v.erase(,);
- cout<<v<<"\n";
- v.clear();
- for(int i=;i>;i--)v[i]=-i;
- v[]=;
- v[]=;
- cout<<v<<"\n";
- v.sort();
- cout<<"V1= "<<v<<"\n";
- Vector<int> v2=v;
- cout<<"V2= "<<v2<<"\n";
- return ;
- }
C++实现vector的更多相关文章
- c++ vector 使用
1. 包含一个头文件: 1 #include <vector> 2. 申明及初始化: std::vector<int> first; // empty vector of in ...
- Vector Tile
Mapbox Vector Tile Specification A specification for encoding tiled vector data. <?XML:NAMESPACE ...
- ArrayList、Vector、LinkedList的区别联系?
1.ArrayList.Vector.LinkedList类都是java.util包中,均为可伸缩数组. 2.ArrayList和Vector底层都是数组实现的,所以,索引数据快,删除.插入数据慢. ...
- ArrayList、Vector、HashMap、HashSet的默认初始容量、加载因子、扩容增量
当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使效率大大降低. 加载因 ...
- Java中Vector和ArrayList的区别
首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList.Vector和LinkedList.List用于存放多个元素,能够维护元素的次序,并且允许元素的重复.3个具体 ...
- C++使用vector
#include <iostream> #include <string> #include <vector> using namespace std; void ...
- [LeetCode] Flatten 2D Vector 压平二维向量
Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [1,2], [3], [4,5,6] ] ...
- C++ 数组array与vector的比较
转:http://blog.csdn.net/yukin_xue/article/details/7391897 1. array 定义的时候必须定义数组的元素个数;而vector 不需要: 且只能包 ...
- vector定义初始化
头文件 #include<vector> using std::vector; vector<T> v1; vector<T> v2(v1); vector< ...
- vector迭代器用法
#include<iostream> #include<vector> using namespace std; int main() { vector<int> ...
随机推荐
- Like与Instr模糊查询性能
项目中用到like模糊查询,但是总觉的太小家子气,有没有高逼格的呢? instr(title,'手册')>0 相当于 title like '%手册%' instr(title,'手册')=1 ...
- NOSDK--一键打包的实现(二)
Android.mk文件,位置在android工程/jni目录下,是android工程中的makefile文件,这里我们简称它为mk文件. 1.2 自动刷新mk文件的脚本介绍 这一节介绍mk文件的自动 ...
- [Data Structure & Algorithm] 八大排序算法
排序有内部排序和外部排序之分,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.我们这里说的八大排序算法均为内部排序. 下图为排序 ...
- 【MySQL】Create table 以及 foreign key 删表顺序考究。
1.以下是直接从数据库导出的建表语句. 1 -- ---------------------------- 2 -- Table structure for files 3 -- ---------- ...
- 翻译:打造Edge渲染内核的浏览器
最近开始了解UWP和Edge内核,在微软技术博客中找到一篇文章,主要是介绍Edge渲染内核使用技术.顺手翻译了一下.不对之处请斧正! Over the past several months, we ...
- MySQL 5.7 学习:安全相关特性
背景: 继上次介绍 初识 MySQL 5.6 新功能.参数完之后,刚好MySQL 5.7又GA了,在官方测试里看到,MySQL5.7在功能.性能.可用性.安全和监控上又提升了很高.现在看看和MySQL ...
- myeclipse6.5注册机
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public ...
- Sublime Text 2 增加python版本
当系统中装有多个python版本时,Sublime Text 2 使用哪个版本需要手动添加 键入一下内容,path输入python的安转路径 保存至Python27.sublime-build文件 ...
- CSS3颜色渐变模式
1.线性渐变:linear-gradient 语法:<linear-gradient> = linear-gradient([ [ <angle> | to <si ...
- 【翻译】ASP.NET MVC 5属性路由(转)
转载链接:http://www.cnblogs.com/thestartdream/p/4246533.html 原文链接:http://blogs.msdn.com/b/webdev/archive ...