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> ...
随机推荐
- codevs1021 玛丽卡
题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...
- Linux进程间通信(七):消息队列 msgget()、msgsend()、msgrcv()、msgctl()
下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信 -- 使用命名管道 一.什么是消息队列 消息队列提 ...
- 自写网站入门阶段之三:兼容大战与jq初探
自上一次作小结至今已整整一个月,在忙乎了半个月的工作之后闲下来的一个下午我终于可以再次作这个阶段的小结了.首先庆幸的是在同学的推荐下我顺利的找到了工作并于月初3号正式上班,这一点非常感谢他,让我免去了 ...
- JS 做时钟
今天,给大家分享一个用JS做的时钟. <!DOCTYPE html><html> <head> <meta charset="utf-8" ...
- BZOJ 4581: [Usaco2016 Open]Field Reduction
Description 有 \(n\) 个点,删掉三个点后,求最小能围住的面积. Sol 搜索. 找出 左边/右边/上边/下边 的几个点枚举就可以了. 我找了 12 个点,统计一下坐标的个数,然后找到 ...
- Unity3D 查找Update函数体为空的类
如果是大项目,有很多Update空跑还是多少有些效率损耗,那我们就把他们都找出来. 先引用Mono.Cecil //代码 using UnityEngine; using UnityEditor; u ...
- ffmpeg-20160901-bin.7z
ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 5 屏幕横向放大 20 像素 6 屏幕横向缩小 20 像素 S 下一帧 [ -2秒 ] +2 ...
- js 中 Math对象
Math 对象是一个固有的对象,无需创建它,直接把 Math 作为对象使用就可以调用其所有属性和方法.这是它与Date,String对象的区别. Math 对象属性 Math 对象方法
- mac下剪切文件或文件夹
首先选中文件,按Command+C复制文件:然后按Command+Option+V:就可以把你的文件剪走了!
- unity3d中串口的使用
工作中遇到了串口的问题,通过查资料&实验写出了下面代码: 关于串口的代码我在网上看了好多,一种是用事件来做,另外一种使用线程来做:(经过试验,unity无法用串口自带的事件进行数据读取): 看 ...