问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

自定义一个arrray类,模拟实现vector类的全部功能,array类的实现用动态内存分配或链表实现

发布网友 发布时间:2022-04-24 12:37

我来回答

1个回答

热心网友 时间:2023-10-13 01:32

#include <cassert>

template<class T>
class vector
{
private:
typedef T& reference;
typedef const T& const_ref;

public:
typedef T* iterator;
typedef const T* const_it;

enum{ INITCAPACITY = 20};

vector()
{
m_capacity = INITCAPACITY;
m_pb = new T[m_capacity];
m_pe = m_pb;
}

vector(size_t s)
{
m_capacity = s>INITCAPACITY ? s:INITCAPACITY;
m_pb = new T[m_capacity];
m_pe = m_pb;
}

~vector()
{
if (m_pb)
{
delete[] m_pb;
m_pb = 0;
}

m_pe = 0;
m_capacity = 0;

}

inline const_ref operator[] (size_t t) const
{
assert( t < (size_t)(m_pe - m_pb));
return m_pb[t];
}

inline iterator begin()
{
return m_pb;
}

inline iterator end()
{
return m_pe;
}

inline const_it begin()const
{
return m_pb;
}

inline const_it end() const
{
return m_pe;
}

inline size_t size() const
{
return m_pe-m_pb;
}

inline size_t capacity()const
{
return m_capacity;
}

inline bool empty() const
{
return m_pe == m_pb;
}

inline const_ref back() const
{
return *(m_pe-1);
}

void push_back(T t)
{
if ( (size_t)(m_pe-m_pb+1) > m_capacity )
{
reserve(m_capacity<<1);
}

*m_pe++ = t;
}

void pop_back()
{
if(m_pe > m_pb)
{
--m_pe;
}
}

void clear()
{
m_pe = m_pb;
}

///////////////////////////////////////////////////////////////////////
//Desc: 倒置容器的元素
///////////////////////////////////////////////////////////////////////
void reverse()
{
iterator b = m_pb;
iterator e = m_pe;

for ( ; --e > b ; ++b )
{
ite_swap(e,b);
}
}

///////////////////////////////////////////////////////////////////////
//Desc: 倒置b e区间的元素
///////////////////////////////////////////////////////////////////////
static void reverse( iterator b, iterator e )
{
for ( ; --e > b ; ++b )
{
ite_swap(e,b);
}
}

///////////////////////////////////////////////////////////////////////
//Desc: 重新分配容器的容量
///////////////////////////////////////////////////////////////////////
void reserve(size_t s)
{
if (s > m_capacity )
{
iterator p = new T[s];

for (iterator it = m_pb; it!= m_pe;)
{
*p++ = *it++;
}

delete[] m_pb;

//*****这里需要保证m_pb释放后仍然指向原来的地址*****//
m_pb = p-(m_pe-m_pb);
m_pe = p;
m_capacity =s;
}
}

///////////////////////////////////////////////////////////////////////
//Desc: 删除容器内b e区间的所有元素,
///////////////////////////////////////////////////////////////////////
void erase(iterator b, iterator e )
{
assert(b >= m_pb && b < m_pe);
assert(e > m_pb && e <= m_pe);

while( e != m_pe)
{
*b++ = *e++;
}

m_pe -= (e-b);
}

///////////////////////////////////////////////////////////////////////
//Desc: 删除容器内的一个元素,
///////////////////////////////////////////////////////////////////////
void erase(iterator it)
{
assert(it >= m_pb && it < m_pe);

while( it !=m_pe )
{
*it++ = *(it+1);
}

--m_pe;
}

///////////////////////////////////////////////////////////////////////
//Desc: 将b e区间的元素复制到容器尾部
///////////////////////////////////////////////////////////////////////
void copyback(const_it b, const_it e )
{
assert( b < e );

for( ; b != e; ++b )
{
if ( (size_t)(m_pe-m_pb+1) > m_capacity )
{
reserve(m_capacity<<1);
}

*m_pe++ = *b;
}
}

///////////////////////////////////////////////////////////////////////
//Desc: 将b e区间符合条件的元素复制到容器尾部
///////////////////////////////////////////////////////////////////////
void copyback(const_it b, const_it e, bool(*f)(const_ref))
{
assert( b < e );

for ( ; b != e; ++b )
{
if ( f(*b))
{
if ((size_t)(m_pe-m_pb+1) > m_capacity )
{
reserve(m_capacity<<1);
}

*m_pe++ = *b;
}
}
}

iterator find_if( bool(*f)(const_ref) )
{
iterator it;

for ( it = m_pb; it != m_pe; ++it)
{
if ( f(*it) )
{
break;
}
}

return it;
}

///////////////////////////////////////////////////////////////////////
//Desc: 在容器内查找第一个元素,如果找到返回指针,否则返回超尾
///////////////////////////////////////////////////////////////////////
iterator find( const_ref t, bool(*f)(const_ref, const_ref) )
{
iterator it;

for ( it = m_pb; it != m_pe; ++it)
{
if ( f(*it,t) )
{
break;
}
}

return it;
}

///////////////////////////////////////////////////////////////////////
//Desc: 在b e区间查找第一个元素,如果找到返回指针,否则返回超尾
///////////////////////////////////////////////////////////////////////
static iterator find_if( iterator b, iterator e, bool(*f)(const_ref) )
{
assert( b < e );

iterator it;

for ( it = b; it != e; ++it)
{
if ( f(*it) )
{
break;
}
}

return it;
}

///////////////////////////////////////////////////////////////////////
//Desc: 查找与最后一个元素,如果找到返回指针,否则返回超尾
///////////////////////////////////////////////////////////////////////
iterator find_end( const_ref val, bool(*f)(const_ref, const_ref) )
{
for (iterator it = m_pe-1; it != m_pb-1; --it)
{
if ( f(*it , val) )
{
return it;
}
}

return m_pe;
}

iterator find_end( bool(*f)(const_ref) )
{
for (iterator it = m_pe-1; it != m_pb-1; --it)
{
if ( f(*it) )
{
return it;
}
}

return m_pe;
}

///////////////////////////////////////////////////////////////////////
//Desc: 查找符合条件的元素数量
///////////////////////////////////////////////////////////////////////
size_t count_if( bool(*f)(const_ref) )
{
size_t count =0;

for (iterator it = m_pb; it != m_pe; ++it)
{
if ( f(*it))
{
++count;
}
}

return count;
}

///////////////////////////////////////////////////////////////////////
//Desc: 查找符合条件的元素数量,可以比较相等或者不相等
///////////////////////////////////////////////////////////////////////
size_t count_if( const_ref val, bool(*f)(const_ref, const_ref) )
{
size_t count =0;

for (iterator it = m_pb; it != m_pe; ++it)
{
if ( f(*it, val))
{
++count;
}
}

return count;
}

///////////////////////////////////////////////////////////////////////
//Desc: 在容器内查找元素,将其删除,并移动超尾
///////////////////////////////////////////////////////////////////////
void remove_if(bool(*f)(const_ref) )
{
for (iterator it = m_pb; it != m_pe; )
{
if ( f(*it))
{
for (iterator it1 = it; it1!= m_pe; ++it1)
{
*it1= *(it1+1) ;
}

--m_pe;
}
else
{
++it;
}
}
}

static void ite_swap( iterator x, iterator y )
{
T t = *x;
*x = *y, *y = t;
}

///////////////////////////////////////////////////////////////////////
//Desc: 依照条件排序b'e区间的元素
///////////////////////////////////////////////////////////////////////
static void sort(iterator b, iterator e, bool(*f)(const_ref,const_ref))
{
assert( b <= e );

for ( ; b != e; ++b )
{
for (iterator it = b+1; it!= e; ++it)
{
if ( f(*it,*b) )
ite_swap(it, b);
}
}
}

///////////////////////////////////////////////////////////////////////
//Desc: 依照条件排序b'e区间的元素
///////////////////////////////////////////////////////////////////////
void sort( bool(*f)(const_ref,const_ref) )
{
iterator b = m_pb;

for ( ; b != m_pe; ++b )
{
for (iterator it = b+1; it!= m_pe; ++it)
{
if ( f(*it,*b) )
ite_swap(it, b);
}
}
}

template< class F >
static void for_each(iterator b, iterator e, F(*f)(reference))
{
assert( b <= e);

while( b != e)
{
f(*b++);
}
}

template< class F >
void for_each( F(*f)(reference) )
{
iterator b = m_pb;

while( b != m_pe)
{
f(*b++);
}
}

///////////////////////////////////////////////////////////////////////
//Desc: 随机打乱b'e区间的元素
///////////////////////////////////////////////////////////////////////
static void random_shuffle(iterator b, iterator e)
{
assert( b < e);

iterator it = b;

for (size_t u = 1; ++it != e; ++u)
{
size_t m = 0x7FFF;
size_t n = rand() & 0x7FFF;

for (; m < u && m != ~0L; m = (m<<0xF) | 0x7FFF )
{
n = (n<<0xF) | 0x7FFF;
}

ite_swap( it, b+(n%u) );
}
}

private:
iterator m_pb;
iterator m_pe;
size_t m_capacity;
};
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
沙尘暴属于自然灾害吗 星配什么字好听男孩 女孩带星字叫什么名字好听又洋气 带星字优美人名 星字如何取名 带星字的名活泼的 非常潮流的星字名 成华区社保局地址 有什么平价又好用的防晒霜值得安利? 有哪些性价比比较高的物理防晒霜可以安利? 如何提高OneDrive和OneNote的访问速度 存储图用链式前向星好还是vector数组 c++里 链表还有用吗?? 听说已经被vector那些取代了 是真的吗?? java.util.Vector 是顺序的,还是链式的?其他的集合呢? C++ vector比链表快吗 C/C++ 实现链表是用vector还是指针比较好 C++中数组,链表和vector等容器之间的区别 3d Max 2010序列号 现在急求: 蔷薇 - 少女 - farewell alibat エンディン 茶太 的歌词 就是3d格斗游戏结尾的时候放的歌歌词。谢谢各位 看过翼的请进 魔法+战斗+爱情+校园的日本动画片 家庭教师 全部人物名单,不要网址、图片、只要名字、 CM3D2扶她出去mod怎么用 有一个3D扶她 主角是个武士 没什么剧情 请问我的QQ邮箱被被注册成为支付宝用户.该怎么取消?如题 谢谢了 我的qq邮箱被别人注册了支付宝,改问题需要我的邮箱+他的银行卡号或者手机号,他也不记得了怎么办? 我QQ邮箱被盗了别人拿我邮箱注册了一个支付宝账号,我现在想用我邮箱注册支付宝怎么办? 为什么别人用我的qq邮箱注册了支付宝账号 而且我的qq邮箱从来没有接受到关于支付宝的邮件. qq邮箱被人注册了支付宝怎么办? 我的QQ邮箱被别人用支付宝绑定了,能不能解除绑定? 中缀表达式转后缀表达式并求值C++数据结构链栈应用 C++的vector是怎么实现的??是靠链表吗? 一棵度为 m的树有n个节点。若每个节点直接用m个链指向相应的儿子,则表示这个树所需要的总空间是多少? 有哪位知道专门翻译dna互补链的网站? 求c++算法,树的最长链,相关的例子,解析 用c++分别实现顺序表、单链表、双链表、顺序栈、链栈、链队列、循环队列的初始化、插入、删除、查找、置空 acm食物链 请教链接中的图片是什么字体?http:&#47;&#47;www.shutterstock.com&#47;pic-2301009&#47;stock-vector-pass-stamp.html 计算机网络的主要拓扑结构类型及各自特点 计算机网络结构的特点 简述互联网结构的特点。 梦见女儿结婚又离婚啥意思? 离婚后又梦见自己有个女儿 昨晚梦见自己结婚几年了还有个女儿后来离婚了 梦见自己离婚的女儿和我很好 梦到已经离婚的对像又结婚了而且也有了自己的孩子是什么意思 自己没结婚但是昨天晚上梦到自己离婚了.还生了个女儿.又离婚了,老公找了个小 昨天梦见我结婚了还生了个女儿后来又离婚了求解梦 onedrive同步速度慢 怎么解决 不收受别人的钱财让你想起想起了什么俗语?