自制简易STL vector
来源:互联网 发布:java实现短信发送功能 编辑:程序博客网 时间:2024/05/01 20:19
自己写的vector 没有内存配置器 只是简单的用库函数申请内存 应该会有一些bug 如有发现请及时指出
#include <iostream>#include <cstdlib>#include <algorithm>using namespace std;template<class T>class MyVector{public: typedef T* iterator;protected: void destory(iterator x) { x->~T(); } void destory(iterator s,iterator e) { iterator temp=s; for(;temp<e;temp++) { destory(temp); } } void construct(iterator t,const T& x) { new (t) T(x);///placement new } void fill_init(iterator first,iterator last,const T& x) { iterator temp=first; for(;temp<last;temp++) { construct(temp,x); } } iterator copy_forward(iterator first,iterator last,iterator pos)///[first,last)所指元素复制到pos为起点 pos>first { iterator c1,c2; c1=last-1; c2=pos+(last-first)-1; for(;c1>=first;c1--,c2--) { construct(c2,*c1); } return pos+(last-first); } iterator copy_backward(iterator first,iterator last,iterator pos)///[first,last)所指元素复制到pos为起点 pos<=first { iterator c1,c2; c1=first,c2=pos; for(;c1<last;c1++,c2++) { construct(c2,*c1); } return c2; }public: iterator begin()const { return start; } iterator end()const { return finish; } T& front()const { return *start; } T& back()const { return *(finish-1); } T& operator[](int x)const { return *(start+x); } int size()const { return finish-start; } int capacity()const { return end_of_storage-start; } bool empty() { return begin()==end(); } MyVector& operator=(const MyVector& x) { this->clear(); int i; for(i=0;i<x.size();i++) { this->push_back(x[i]); } return *this; } MyVector(): start(0),finish(0),end_of_storage(0) { } explicit MyVector(int n): start((T*)malloc(sizeof(T)*n)),finish(start+n),end_of_storage(finish)///只申请内存但没有调用构造函数 { fill_init(start,start+n,T()); } MyVector(int n,const T& x): start((T*)malloc(sizeof(T)*n)),finish(start+n),end_of_storage(finish) { fill_init(start,start+n,x); } ~MyVector() { destory(start,finish); free(start); } MyVector( MyVector& x): start(0),finish(0),end_of_storage(0) { this->operator=(x); } void push_back(const T& x) { if(finish!=end_of_storage) { construct(finish,x); finish++; } else { int oldsize=size(); int new_size=oldsize==0? 1:oldsize*2; iterator new_start=(T*)malloc(new_size*sizeof(T)); iterator new_finish=new_start+oldsize; iterator new_end_of_storage=new_start+new_size; copy_backward(start,finish,new_start); destory(start,finish); free(start); start=new_start; finish=new_finish; end_of_storage=new_end_of_storage; construct(finish,x); finish++; } } void insert(iterator pos,const T& x) { if(finish!=end_of_storage) { copy_forward(pos,finish,pos+1); finish++; construct(pos,x); } else { int oldsize=size(); int new_size=oldsize==0? 1:oldsize*2; iterator new_start=(T*)malloc(new_size*sizeof(T)); iterator new_finish; iterator new_end_of_storage=new_start+new_size; new_finish=copy_backward(start,pos,new_start); construct(new_finish,x); new_finish++; new_finish=copy_backward(pos,finish,new_finish); destory(start,finish); free(start); start=new_start; finish=new_finish; end_of_storage=new_end_of_storage; } } iterator erase(iterator first,iterator last)///不释放内存 只调用析构函数 { copy_backward(last,finish,first); destory(last,finish); finish=finish-(last-first); return first; } iterator erase(iterator pos) { erase(pos,pos+1); } void clear() { erase(start,finish); } void resize(int new_size,const T& x) { if(new_size<size()) { erase(begin()+new_size,end()); } else { int remain=begin()+new_size-finish; while(remain--) { this->push_back(x); } } } void resize(int new_size) { resize(new_size,T()); } void pop_back() { erase(end()-1); } iterator find(const T& x) { iterator temp(begin()); for(;temp!=end();temp++) { if(*temp==x) { break; } } return temp; }private: iterator start; iterator finish; iterator end_of_storage;};int main(){ MyVector<int> v; int i,j; for(i=0;i<10;i++) { v.push_back(i); } for(i=0;i<v.size();i++) { cout<<v[i]<<endl; } MyVector<int>::iterator it=v.begin(); it++,it++,it++; v.erase(v.begin(),it); cout<<v.size()<<" size.."<<endl; for(i=0;i<v.size();i++) { cout<<v[i]<<".."<<endl; } v.insert(v.begin()+3,2); for(i=0;i<v.size();i++) { cout<<v[i]<<"...."<<endl; } MyVector<int> v2(v); //cout<<v2.size()<<" size"<<endl; for(i=0;i<v2.size();i++) { cout<<v2[i]<<"ssss"<<endl; } v2.push_back(1); v2.push_back(3); v2.push_back(4); for(i=0;i<v2.size();i++) { cout<<v2[i]<<"multi"<<endl; } sort(v2.begin(),v2.end()); v2.resize(unique(v2.begin(),v2.end())-v2.begin()); for(i=0;i<v2.size();i++) { cout<<v2[i]<<"......"<<endl; } v2.erase(v2.find(4),v2.end()); cout<<"after delete "<<endl; for(i=0;i<v2.size();i++) { cout<<v2[i]<<endl; }}
0 0
- 自制简易STL vector
- STL源码之实现一个简易的Vector容器
- 简易Vector
- 自制 简易 Gadgets
- 自制的简易通讯录
- 自制简易激光雷达
- 自制简易加湿器
- 自制简易版手游摇杆
- STL vector
- STL vector
- stl vector
- STL vector
- STL vector
- stl-vector
- STL--vector
- STL Vector
- stl vector
- STL:vector
- startActivityForResult和setResult详解
- spring ioc原理(看完后大家可以自己写一个spring)
- 深度学习入门材料
- 《Objective-C 高级编程 iOS与OS X多线程和内存管理》 核心札记一
- GitHub 之 the authenticity of host ... can't be established
- 自制简易STL vector
- 【IDA*】hdu 1560
- POJ 2385 Apple Catching DP
- Android添加按钮事件的几种方法
- ubuntu 安装wineqq国际版方法及可能出现的问题
- 详解hosts文件
- 为什么我们应该像盖房子那样写程序?
- Java设计模式之从[鼠标接口][星际争霸中的兵种行为]分析适配器(Adapter)模式
- 事从容,则有余味;人从容,则有余年