用了双向链表,快排,<<,=,[]重载,还有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的更多相关文章

  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. codevs3250 操作序列

    题目描述 Description Petya是一个非常好玩孩子.他很无聊,因此他开始玩下面的游戏: 他得到一个长度为N的整数序列,他会对这些数字进行操作,他可以把某个数的数值加1或者减1(当然他可以对 ...

  2. Ubuntu12.04安装lnmp环境笔记

    说明:笔记中使用的命令都是在root账户权限下执行的,如果使用的是普通账户,请注意在命令前加上“sudo”指令. 1.更新apt-get软件库: 命令:apt-get update 该操作的目的是确保 ...

  3. PHP格式化显示文件大小函数

    用filesize() 函数可以返回文件的大小,可是返回值是以字节(B)为单位的,看起来不方便.怎么让它根据文件的大小自动以KB.MB.GB为单位显示呢,用下面这个函数就可以实现了. <?php ...

  4. Linux cp (复制)命令简介

    \cp  -rf  source1  source2   source3   ....   directory cp (复制档案或目录) [root@linux ~]# cp [-adfilprsu] ...

  5. MVC与MVVM区别?

    在MVC里,View是可以直接访问Model的!从而,View里会包含Model信息,不可避免的还要包括一些业务逻辑. MVC模型关注的是Model的不变,所以,在MVC模型里,Model不依赖于Vi ...

  6. espcms联动筛选功能开发

    易思后台增加新内容模型,添加字段yewu,fuwu,leixing 修改/interface/article.php (写上新增内容模型的mid——写死的),对这个模型的内容列表写了可以联动筛选的sq ...

  7. Nginx上传文件返回413的解决

    通过http上传文件时返回403 Request Entity Too Large错误时,原因是默认设置的允许上传文件太小,默认是2M,如果上传文件大小大于2M时,那么就会返回413的错误,修改ngi ...

  8. ACM/ICPC 之 最小割转网络流(POJ3469)

    重点:构图 //最小割转网络流 //邻接表+Dinic //Time:5797Ms Memory:6192K #include<iostream> #include<cstring& ...

  9. seajs hello world

    http://localhost/seajs/index.html <!doctype html> <head> <title>Hello Seajs</ti ...

  10. 14. Longest Common Prefix

    题目: Write a function to find the longest common prefix string amongst an array of strings. Subscribe ...