用了双向链表,快排,<<,=,[]重载,还有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. table td 文字超出显示省略号

    .autocut {      width:250px;      overflow:hidden;      white-space:nowrap;      text-overflow:ellip ...

  2. 解决Xftp经常断开连接的问题,Xftp中文乱码

    #文件 --> 选项 --> 勾选“发送保持活动状态消息” 间隔 60秒 #工具 -> 选项 延伸阅读: Xshell个性化设置,解决Xshell遇到中文显示乱码的问题

  3. PHP错误级别 error_reporting() 函数详解

    在PHP开发的时候常常会用到error_reporting(report_level)来调试自己的程序,下面列出了report_level可能值: 值 常量 描述 1 E_ERROR 这是一个严重错误 ...

  4. jenkins自动化构建iOS应用配置过程中遇到的问题

    最近配置jenkins来自动构建iOS应用,期间遇上不少问题.在这里分享给大家,也给自己留个底,方便下次解决问题. 首先说明下基本情况,我们因为部署jenkins的机器不是Mac,所以不能安装Xcod ...

  5. CDN的特点

    CDN的特点 1.本地Cache加速提高了企业站点(尤其含有大量图片和静态页面站点)的访问速度,并大大提高以上性质站点的稳定性(省钱,用户体验提升). 2.镜像服务消除了不同运营商之间的瓶颈造成的影响 ...

  6. jquery 页面加载时获取图片高度

    $(function () { $(window).load(function(){ alert($('img').height()); }); });

  7. linux常用命令-文件处理命令

    ls -a -l -d -h -i mkdir [-p] 创建目录,-p递归创建目录 rmdir 删除一个空目录 cp [-r,-p] -r,拷贝目录,-p,保持属性,新文件的修改时间为源文件的修改时 ...

  8. git 教程(13)--创建与合并分支

    在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支.HEAD严格来说不是指向提交,而 ...

  9. 记录一下两个比较常用的md5加密算法

    第一个,计算字符串的md5值 public static String getMD5(String s){ String newString = null; byte[] inputByteArray ...

  10. OpenVpn简单架设

    首先Wget wget http://swupdate.openvpn.org/as/openvpn-as-2.0.24-CentOS6.i386.rpm wget http://swupdate.o ...