C/C++ 的使用
C++ http://www.cplusplus.com/
http://www.cplusplus.me/
*****************容器container vector
转自 http://blog.csdn.net/qscool1987/article/details/7050487
- #ifndef _MY_VECTOR_H
- #define _MY_VECTOR_H
- #include <string.h>
- #include <assert.h>
- template<class T>
- class MyVector
- {
- public:
- class iterator
- {
- public:
- iterator():pelem(NULL){}
- iterator(T *pt):pelem(pt){}
- iterator(const iterator &iter);
- iterator& operator = (const iterator &iter);
- iterator& operator = (T *pt);
- ~iterator(){}
- bool operator != (const iterator &iter);
- iterator& operator ++ ();
- iterator& operator ++ (int);
- iterator& operator -- ();
- iterator& operator -- (int);
- iterator operator + (size_t size);
- iterator operator - (size_t size);
- iterator& operator -= (size_t size);
- iterator& operator += (size_t size);
- T& operator * ();
- //functions add here
- private:
- T *pelem;
- };
- //constructor
- MyVector():pbuff(NULL),beg(NULL),last(NULL),count(0),capcity(0){}
- MyVector(const MyVector &orig);
- MyVector& operator = (const MyVector &orig);
- ~MyVector();
- //member function
- T& operator [] (size_t index);
- void pushback(const T &mt);
- iterator insert(size_t index,const T &mt);
- iterator insert(const T *phead,const T *pback, iterator p);
- iterator erase(size_t index);
- iterator erase(iterator phead, iterator pback);
- void clear();
- size_t size();
- size_t capacity();
- iterator begin();
- iterator end();
- private:
- void del_buff()
- {
- if(NULL != pbuff)
- {
- delete pbuff;
- pbuff = NULL;
- }
- }
- T *pbuff;//Memory buff for elements
- iterator beg;
- iterator last;
- size_t count;
- size_t capcity;
- };
- /**MyVector's member functions**/
- /**here are the member functions implementations**/
- template<class T>
- size_t MyVector<T>::size()
- {
- return count;
- }
- template<class T>
- size_t MyVector<T>::capacity()
- {
- return capcity;
- }
- template<class T>
- MyVector<T>::MyVector(const MyVector<T> &orig)
- {
- count = orig.size();
- capcity = 2*count;
- pbuff = new T [count*2];
- size_t totalbytes = count*2*sizeof(T);
- memcpy(pbuff,orig.pbuff,totalbytes);
- }
- template<class T>
- MyVector<T>& MyVector<T>::operator = (const MyVector<T> &orig)
- {
- del_buff();
- count = orig.size();
- capcity = 2*count;
- pbuff = new T [count*2];
- size_t totalbytes = count*2*sizeof(T);
- memcpy(pbuff,orig.pbuff,totalbytes);
- return *this;
- }
- template<class T>
- MyVector<T>::~MyVector<T>()
- {
- del_buff();
- }
- template<class T>
- T& MyVector<T>::operator[](size_t index)
- {
- return pbuff[index];
- }
- template<class T>
- void MyVector<T>::pushback(const T &mt)
- {
- if(NULL == pbuff && 0 == count)
- {
- pbuff = new T[(1+count)*2];
- pbuff[0] = mt;
- count++;
- capcity = 2*count;
- }
- else
- {
- if(NULL != pbuff && count == capcity)
- {
- capcity *= 2;
- T *ptem = new T[capcity];
- size_t totalbytes = capcity*sizeof(T);
- memcpy(ptem,pbuff,totalbytes);
- del_buff();
- pbuff = ptem;
- pbuff[count] = mt;
- count ++;
- }
- if(NULL != pbuff && count != capcity)
- {
- pbuff[count] = mt;
- count++;
- }
- }
- }
- template<class T>
- typename MyVector<T>::iterator MyVector<T>::insert(size_t index,const T &mt)
- {
- assert(count >= index);
- if(NULL != pbuff && count == capcity)
- {
- capcity *= 2;
- T *ptem = new T[capcity];
- memcpy(ptem,pbuff,capcity*sizeof(T));
- ptem[index] = mt;
- memcpy(&ptem[index+1],(count-index)*sizeof(T));
- del_buff();
- pbuff = ptem;
- count ++;
- typename MyVector<T>::iterator _iter(&pbuff[index]);
- return _iter;
- }
- else if(NULL != pbuff && count != capcity)
- {
- size_t _end = count-1;
- size_t _beg = index;
- for(;_end >= _beg;_end--)
- pbuff[_end+1] = pbuff[_end];
- pbuff[index] = mt;
- count++;
- typename MyVector<T>::iterator _iter(&pbuff[index]);
- return _iter;
- }
- }
- template<class T>
- typename MyVector<T>::iterator MyVector<T>::
- insert(const T *phead,const T *pback,
- typename MyVector<T>::iterator p)
- {
- typename MyVector<T>::iterator _beg = begin(),_end = end();
- size_t insertnum = 0;
- for(;phead != pback;phead++)
- insertnum++;
- phead -= insertnum;
- size_t index = 0;
- for(;_beg != p;_beg++)
- index++;
- if(count +insertnum > capcity && NULL != pbuff)
- {
- capcity = 2*(count +insertnum);
- T *ptem = new T [capcity];
- memcpy(ptem,pbuff,(index)*sizeof(T));
- memcpy(&ptem[index],phead,insertnum*sizeof(T));
- memcpy(&ptem[index+insertnum],&pbuff[index],
- (count-index)*sizeof(T));
- del_buff();
- pbuff = ptem;
- count += insertnum;
- typename MyVector<T>::iterator _iter(&pbuff[index]);
- return _iter;
- }
- else if(count +insertnum <= capcity && NULL != pbuff)
- {
- for(size_t i = insertnum;i != 0;i--,count--)
- pbuff[count+insertnum-1] = pbuff[count-1];
- for(;phead != pback;phead++,p++)
- *p = *phead;
- count += insertnum;
- return p;
- }
- if(NULL == pbuff && 0 == count)
- {
- capcity = 2*insertnum;
- pbuff = new T[capcity];
- memcpy(pbuff,phead,insertnum*sizeof(T));
- count = insertnum;
- typename MyVector<T>::iterator _iter(&pbuff[0]);
- return _iter;
- }
- }
- template<class T>
- typename MyVector<T>::iterator MyVector<T>::erase(size_t index)
- {
- T *temp = new T[count-index-1];
- memcpy(temp,&pbuff[index+1],(count-index-1)*sizeof(T));
- memcpy(&pbuff[index],temp,(count-index-1)*sizeof(T));
- pbuff[count-1] = '\0';
- count--;
- delete [] temp;
- typename MyVector<T>::iterator _iter(&pbuff[index]);
- return _iter;
- }
- template<class T>
- typename MyVector<T>::iterator MyVector<T>::
- erase( typename MyVector<T>::iterator phead,
- typename MyVector<T>::iterator pback)
- {
- size_t elemnum = 0;
- size_t _toend = 0;
- for(;phead != pback;phead++)
- elemnum++;
- phead -= elemnum;
- for(;pback != end();pback++)
- _toend++;
- pback -= _toend;
- T *temp = new T[_toend];
- memcpy(temp,&pbuff[count-_toend],_toend*sizeof(T));
- memcpy(&pbuff[count-elemnum-_toend],temp,_toend*sizeof(T));
- memset(&pbuff[count-elemnum],'\0',(count-elemnum)*sizeof(T));
- delete [] temp;
- count -= elemnum;
- return phead;
- }
- template<class T>
- typename MyVector<T>::iterator MyVector<T>::begin()
- {
- beg = &pbuff[0];
- return beg;
- }
- template<class T>
- typename MyVector<T>::iterator MyVector<T>::end()
- {
- last = &pbuff[count];
- return last;
- }
- /**nested dependent typeclass**/
- /**implementation**/
- template<class T>
- MyVector<T>::iterator::iterator(const typename MyVector<T>::iterator &iter)
- {
- pelem = iter.pelem;
- }
- template<class T>
- typename MyVector<T>::iterator& MyVector<T>::iterator::
- operator = (const typename MyVector<T>::iterator &iter)
- {
- pelem = iter.pelem;
- return *this;
- }
- template<class T>
- typename MyVector<T>::iterator& MyVector<T>::iterator::
- operator = (T *pt)
- {
- pelem = pt;
- return *this;
- }
- template<class T>
- bool MyVector<T>::iterator::operator !=
- (const typename MyVector<T>::iterator &iter)
- {
- if(pelem != iter.pelem)
- return true;
- else
- return false;
- }
- template<class T>
- typename MyVector<T>::iterator& MyVector<T>::iterator::operator ++ ()
- {
- ++pelem;
- return *this;
- }
- template<class T>
- typename MyVector<T>::iterator& MyVector<T>::iterator::operator ++ (int)
- {
- pelem++;
- return *this;
- }
- template<class T>
- typename MyVector<T>::iterator& MyVector<T>::iterator::operator -- (int)
- {
- pelem--;
- return *this;
- }
- template<class T>
- typename MyVector<T>::iterator& MyVector<T>::iterator::operator -- ()
- {
- --pelem;
- return *this;
- }
- template<class T>
- typename MyVector<T>::iterator& MyVector<T>::iterator::operator += (size_t size)
- {
- pelem += size;
- return *this;
- }
- template<class T>
- typename MyVector<T>::iterator& MyVector<T>::iterator::operator -= (size_t size)
- {
- pelem -= size;
- return *this;
- }
- template<class T>
- typename MyVector<T>::iterator MyVector<T>::iterator::operator + (size_t size)
- {
- pelem += size;
- typename MyVector<T>::iterator _iter(pelem);
- return _iter;
- }
- template<class T>
- typename MyVector<T>::iterator MyVector<T>::iterator::operator - (size_t size)
- {
- pelem -= size;
- typename MyVector<T>::iterator _iter(pelem);
- return _iter;
- }
- template<class T>
- T& MyVector<T>::iterator::operator * ()
- {
- return *pelem;
- }
- #endif
随机推荐
- pycharm的使用破解和Anaconda的使用
1.pycharm的破解: 版本: pycharm 2016.2.3 链接: 下载专业版本 下面是这个版本的注册码: 43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTcz ...
- c#读写xml文件
using System; using System.Collections.Generic; using System.Xml; using System.Text.RegularExpressio ...
- Mui沉浸模式以及状态栏颜色改变
沉浸模式只需要设置下就可以 ios: 打开应用的manifest.json文件,切换到代码视图,在plus -> distribute -> apple 下添加UIReserveSta ...
- ASP.NET MVC - 创建Internet 应用程序
为了学习 ASP.NET MVC,我们将构建一个 Internet 应用程序. 第 1 部分:创建应用程序. 我们将构建什么 我们将构建一个支持添加.编辑.删除和列出数据库存储信息的 Internet ...
- caffe的python接口学习(6):用训练好的模型(caffemodel)来分类新的图片
经过前面两篇博文的学习,我们已经训练好了一个caffemodel模型,并生成了一个deploy.prototxt文件,现在我们就利用这两个文件来对一个新的图片进行分类预测. 我们从mnist数据集的t ...
- Manacher's Algorithm 马拉车算法
这个马拉车算法Manacher‘s Algorithm是用来查找一个字符串的最长回文子串的线性方法,由一个叫Manacher的人在1975年发明的,这个方法的最大贡献是在于将时间复杂度提升到了线性,这 ...
- Apache配置手札
一.绑定域名到子目录 在httpd.conf文件末尾添加 #不同的域名对应到的目录 <VirtualHost *:80> DocumentRoot "D:\wamp\www\ba ...
- 基于SuperSocket的IIS主动推送消息给android客户端
在上一篇文章<基于mina框架的GPS设备与服务器之间的交互>中,提到之前一直使用superwebsocket框架做为IIS和APP通信的媒介,经常出现无法通信的问题,必须一天几次的手动回 ...
- 招聘前端、Java后端开发、测试、Mysql DBA
公司介绍: http://www.lagou.com/gongsi/43095.html http://www.yamichu.com 简历发到: zhuye@yamichu.com 招聘职位: JA ...
- inline-block元素间距
做项目过程中发现元素设置为inline-block后,彼此之间会有间距,有时候不是我们想要的效果,这时候就需要将间距去除掉. 后来上网查了下,已有前人总结了不少好的方法.这里主要借鉴了张鑫旭博客中介绍 ...