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
随机推荐
- no-proxy 和proxy 的区别
Child <- many-to-one ->Parent class Child { private Parent paren ...
- HTTP状态码对应
HTTP的状态码 对于状态码大家如果经常在线买东西就能知道,我们买了东西就会有个订单状态:出库.发货中.送达中.送达等,其实这些状态就是状态码,只不过这些状态码都是文字.HTTP 响应的时候也有状态码 ...
- C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 密码强化、网络安全强化
公司的系统庞大后,用户数量也庞大,容易引起各种网络安全相关问题,需要把每个用户的网络安全意识都提高,由于历史原因有些用户的密码过于简单,很容易被猜到,引起很多没必要的麻烦. 系统登录成功后,检查密码复 ...
- Linux 进程间通讯详解五
msgrcv函数 ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg); --功能:是从一个消息队列接 ...
- Android 高清加载巨图方案 拒绝压缩图片
Android 高清加载巨图方案 拒绝压缩图片 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/49300989: 本文出自:[张 ...
- WEB安全:XSS漏洞与SQL注入漏洞介绍及解决方案
对web安全方面的知识非常薄弱,这篇文章把Xss跨站攻击和sql注入的相关知识整理了下,希望大家多多提意见. 对于防止sql注入发生,我只用过简单拼接字符串的注入及参数化查询,可以说没什么好经验,为避 ...
- vs2015 安装之后安装MSSM 2016 导致 vs启动报错 System.ArgumentException 已添加了具有相同键的项,ActivityLog.xml
如题,先是装了vs2015,开发什么的都没有问题,后来安装了SqlServer2016 MSSM,出大问题了,vs2015打开就报错,具体错误如上,还想还有个ActivityLog.xml 这个文件的 ...
- 一个小时快速搭建微信小程序教程
「小程序」这个划时代的产品发布快一周了,互联网技术人都在摩拳擦掌,跃跃欲试.可是小程序目前还在内测,首批只发放了 200 个内测资格(泪流满面).本以为没有 AppID 这个月就与小程序无缘了,庆幸的 ...
- Windows phone应用开发[20]-禁止Pivot手势
相比Ios 和Android. Windows Phone 控件库中多了两个比较特殊的空间Pivot 枢轴和Panamera 全景视图控件.在基于枢轴控件Pivot中我们经常会碰到一些比较特殊应用场景 ...
- mysql中的优化, 简单的说了一下垂直分表, 水平分表(有几种模运算),读写分离.
一.mysql中的优化 where语句的优化 1.尽量避免在 where 子句中对字段进行表达式操作select id from uinfo_jifen where jifen/60 > 100 ...