自己创建一个新的Vec类用来实现vector的功能
2014-12-17 17:17
399 查看
RT
#include <iostream> using namespace std; template <class T> class Vec{ public: typedef T* iterator; typedef const T* const_iterator; typedef size_t size_type; typedef T value_type; typedef T& reference; typedef const T& const_reference; Vec() {create();} explicit Vec(size_type n,const T& t=T()){create(n,t);} Vec(const Vec&v){create(v.begin(),v.end());} Vec& operator=(const Vec&); ~Vec(){uncreate();} T& operator[](size_type i){return data[i];} const T& operator[] (size_type i) const {return data[i];} void push_back(const T& t){ if(avail == limit) { grow(); } unchecked_append(t); } size_type size() const {return avail - data;} iterator begin(){return data;} const_iterator begin() const{return data;} iterator end() {return avail;} const_iterator end() const{return avail;} private: iterator data; iterator avail; iterator limit; allocator<T> alloc; void create(); void create(size_type,const T&); void create(const_iterator,const_interator); void uncreate(); void grow(); void unchecked_append(const T&); }; //构造函数 template <class T> void Vec<T>::create() { data=avail=limit=0; } template <class T> void Vec<T>::create(size_type n,const T&val) { data = alloc.allocate(n); limit = avail = data+n; uninitialized_fill(data,limit,val); } template <class T> void Vec<T>::create(const_iterator i,const_iterator j) { data= alloc.allocate(j-i); limit = avail = uninitlized_copy(i,j,data); } //析构函数 template <class T> void Vec<T>::uncreate() { if(data) { iterator it = avail; while(it!=data) alloc.destroy(--it); alloc.deallocate(data,limit-data); } data=limit=avail=0; } // template <class T> void Vec<T>::grow() { size_type new_size = max(2*(limit-data),ptrdiff_t(1)); iterator new_data = alloc.allocate(new_size); iterator new_avail = uninitialized_copy(data,avail,new_data): uncreate(); data=new_data; avail = new_avail; limit = data+new_size; } template <class T> void Vec<T>::unchecked_append(const T& val) { alloc.construct(avail++,val); }
相关文章推荐
- 自己编写的一个Json工具类,实现了反射将整个Object转换为Json对象的功能,支持Hibernate的延迟加载对象
- 自己实现vector的一些简单功能
- 自己动手创建一个Web Server(非Socket实现)
- 创建一个函数,实现库函数strstr的功能
- 自己写了一个上传类,实现了常用的功能
- 2048当中实现了,创建一个新块的随机功能
- [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)
- 自己写了一个链表功能还不完善但是简单的增删改查功能都已经实现了
- Python实现日志自动记录功能(一个思路代码,详细可以自己扩展)
- 简单工厂(Factory)-提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类。
- 自己编写的一个Json工具类,实现了反射将整个Object转换为Json对象的功能,支持Hibernate的延迟加载对象[修订081217]
- 创建一个宏,实现通过excel导出TXT文本功能
- 批量处理 Html img 标签,给 img 标签包裹一个 <a href="${url}"> 标签,用来实现“查看大图”的功能
- 使用IO技术,创建一个目录,然后复制一个文件到该目录!实现复制的功能。(在博客园上传的第一份代码)
- 自己实现的一个数组排序并去重的功能
- 自己写的一个项目中实现的购物车功能!购物车页面以及实现购物车相应的dao包!
- 第四篇 ANDROID窗口管理服务实现机制 窗口管理是ANDROID框架一个重要部分,主要包括如下功能: (1)Z-ordered的维护 (2)窗口的创建、销
- 创建一个如下的窗体,并在窗体上放置colorDialog控件。实现功能:1)程序运行时,单击打开颜色对话框按钮,可选择颜色,并以所选颜色作为窗体背景色
- C++自己实现一个简单地Vector
- [VB.NET]利用vb.net创建一个完全可编辑的DataGrid,从而实现操作Access数据库进行增,删,改的功能,前提是不用任何其他的Button