首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
其他好文
> 详细
Vector部分实现
时间:
2014-09-03 16:45:16
阅读:
257
评论:
0
收藏:
0
[点我收藏+]
标签:
io
ar
for
art
cti
sp
on
amp
c
#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
Vector部分实现
标签:
io
ar
for
art
cti
sp
on
amp
c
原文地址:http://www.cnblogs.com/yiyutianran/p/3953925.html
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
分布式事务
2021-07-29
OpenStack云平台命令行登录账户
2021-07-29
getLastRowNum()与getLastCellNum()/getPhysicalNumberOfRows()与getPhysicalNumberOfCells()
2021-07-29
【K8s概念】CSI 卷克隆
2021-07-29
vue3.0使用ant-design-vue进行按需加载原来这么简单
2021-07-29
stack栈
2021-07-29
抽奖动画 - 大转盘抽奖
2021-07-29
PPT写作技巧
2021-07-29
003-核心技术-IO模型-NIO-基于NIO群聊示例
2021-07-29
Bootstrap组件2
2021-07-29
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!