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> ...
随机推荐
- LYDSY模拟赛day2 Market
/* orz claris,这个题的解法非常巧妙,首先是时间问题,其实这个问题只要离线处理一下就可以了,把物品和询问都按照时间排序,然后看一下能不能满足.然后,因为容量<=10^9,显然是不可能 ...
- [Search Engine] 搜索引擎分类和基础架构概述
大家一定不会多搜索引擎感到陌生,搜索引擎是互联网发展的最直接的产物,它可以帮助我们从海量的互联网资料中找到我们查询的内容,也是我们日常学习.工作和娱乐不可或缺的查询工具.之前本人也是经常使用Googl ...
- Navigation Bar options for Android (based on photosomething project)
1, Tab控件即标签页,可以在一页中切换显示n页内容,要使用此效果,需要用到TabHost和Tabwidget类.(过时了?) Tab控件具有两种实现过程,一是在同一个Activity中切换显示不同 ...
- java基础 字符串 “==” 和 “equals” 比较
demo: public class TestStringEquals { public static void main(String[] args) { String a = "test ...
- 【Network】golang 容器项目 flannel/UDP相关资料
参考资料: flannel_百度搜索 Flannel首页.文档和下载 - 容器集群子网 - 开源中国社区 docker下基于flannel的overlay网络分析 - OPEN 开发经验库 flann ...
- 使用SQL语句对数据进行MD5加密
如果数据库表User中有一列为passwd,存放的是md5加密的数据,如何更新新的数据. update user set passwd=md5("123321") where uN ...
- objccn-iOS上的相机捕捉
在第一台iPhone时,在app里面整合相机的唯一方法就是使用UIImagePickerController.到了iOS4,发布了更灵活的AVFoundation框架. UIImagePickerCo ...
- Other Linker Flags到底是什么
一.问题描述 在项目开发中用到百度地图,有时候在工程中会报“方法找不到”的错误(unrecognized selector sent to instance). 二.问题分析 首先,要说明一下Othe ...
- Revit 自定义RibbonPanel到Revit中
项目下找到TheApplication.cs,更改内容: class TheApplication : IExternalApplication { public Result O ...
- 【转】如何使用VS 2013发布一个可以在Windows XP中独立运行的可执行文件
问题描述: 用VS2013写好一个程序,在本机上运行一切正常.但是如果直接把exe文件放到另一台机器上用,则会出现: Windows XP:不是一个正常的win32程序 Window 7:缺少msvc ...