#include <memory.h>#include <stdexcept>
#include <assert.h>
class
CArrary
{
public
:
class
iterator
{
public
:
iterator& operator++()
{
assert
(m_data != m_end);
m_data++;
return
*
this
;
}
iterator& operator--()
{
assert
(m_data != m_begin);
m_data--;
return
*
this
;
}
iterator operator++(
int
)
{
assert
(m_data != m_end);
char
* temp = m_data;
m_data++;
return
iterator(temp, m_begin, m_end);
}
iterator operator--(
int
)
{
assert
(m_data != m_begin);
char
* temp = m_data;
m_data--;
return
iterator(temp, m_begin, m_end);
}
char
& operator*()
{
return
*m_data;
}
bool
operator==(
const
iterator& itr)
{
return
m_data == itr.m_data;
}
bool
operator!=(
const
iterator& itr)
{
return
m_data != itr.m_data;
}
private
:
friend
class
CArrary;
iterator(
char
*data,
char
*begin,
char
*end)
{
m_data = data;
m_begin = begin;
m_end = end;
}
private
:
char
* m_data;
char
* m_begin;
char
* m_end;
};
public
:
iterator begin()
{
return
iterator(m_pBuff, m_pBuff - 1, m_pBuff + m_nElementSize);
}
iterator end()
{
return
iterator(m_pBuff + m_nElementSize, m_pBuff - 1, m_pBuff + m_nElementSize);
}
public
:
CArrary();
CArrary(
const
CArrary& ary);
virtual
~CArrary();
public
:
void
InitFun();
bool
AddHead(
int
val);
bool
AddTail(
int
val);
bool
Insert(
int
nIdx,
int
val);
bool
Insert(iterator itr,
int
val)
{
int
nIndex = itr.m_data - m_pBuff;
Insert(nIndex, val);
}
bool
RemoveHead();
bool
RemoveTail();
bool
Remove(
int
nIdx);
bool
Remove(iterator itr)
{
int
nIndex = itr.m_data - m_pBuff;
Remove(nIndex);
}
bool
SetVal(
int
nIdx,
int
val);
bool
SetVal(iterator itr,
int
val) {}
char
& operator[](
int
nIdx);
CArrary& operator+=(
const
CArrary& ary);
CArrary& operator=(
const
CArrary& ary);
int
Find(
int
val);
int
Size()
const
;
void
Clear();
private
:
char
*m_pBuff;
int
m_nBuffSize;
int
m_nElementSize;
};
void
CArrary::InitFun()
{
m_pBuff =
nullptr
;
m_nElementSize = 0;
m_nBuffSize = 0;
}
CArrary::CArrary()
{
InitFun();
}
CArrary::CArrary(
const
CArrary& ary)
{
InitFun();
*
this
= ary;
}
CArrary::~CArrary()
{
Clear();
}
bool
CArrary::AddHead(
int
val)
{
return
Insert(0, val);
}
bool
CArrary::AddTail(
int
val)
{
return
Insert(m_nElementSize, val);
}
bool
CArrary::Insert(
int
nIdx,
int
val)
{
if
(m_pBuff ==
nullptr
)
{
const
int
nInitBuffSize = 4;
m_nBuffSize = nInitBuffSize;
m_pBuff =
new
char
[m_nBuffSize];
m_nElementSize = 0;
}
if
(nIdx < 0 || nIdx > m_nElementSize)
{
return
false
;
}
if
(m_nElementSize >= m_nBuffSize)
{
m_nBuffSize = m_nBuffSize * 2;
char
* pNewBuff =
new
char
[m_nBuffSize];
memcpy
(pNewBuff, m_pBuff, m_nElementSize *
sizeof
(
char
));
delete
[]m_pBuff;
m_pBuff = pNewBuff;
}
memcpy
(&m_pBuff[nIdx + 1], &m_pBuff[nIdx], (m_nElementSize - nIdx) *
sizeof
(
char
));
m_pBuff[nIdx] = val;
m_nElementSize++;
return
true
;
}
bool
CArrary::RemoveHead()
{
return
Remove(0);
}
bool
CArrary::RemoveTail()
{
return
Remove(m_nElementSize - 1);
}
bool
CArrary::Remove(
int
nIdx)
{
if
(m_pBuff ==
nullptr
|| nIdx < 0 || nIdx >= m_nElementSize)
{
return
false
;
}
memcpy
(&m_pBuff[nIdx],
&m_pBuff[nIdx + 1],
(m_nElementSize - nIdx - 1) *
sizeof
(
char
));
m_nElementSize--;
return
true
;
}
bool
CArrary::SetVal(
int
nIdx,
int
val)
{
if
(nIdx < 0 || nIdx >= m_nElementSize)
{
return
false
;
}
m_pBuff[nIdx] = val;
return
true
;
}
char
& CArrary::operator[](
int
nIdx)
{
if
(nIdx < 0 || nIdx >= m_nElementSize || m_pBuff ==
nullptr
)
{
throw
std::out_of_range(
"访问越界"
);
}
return
m_pBuff[nIdx];
}
CArrary& CArrary::operator+=(
const
CArrary & ary)
{
if
(ary.m_pBuff ==
nullptr
)
{
return
*
this
;
}
if
(m_pBuff ==
nullptr
)
{
*
this
= ary;
return
*
this
;
}
char
* pNewBuff =
new
char
[m_nBuffSize + ary.m_nBuffSize];
for
(
int
i = 0; i < m_nElementSize; i++)
{
pNewBuff[i] = m_pBuff[i];
}
for
(
int
i = 0; i < ary.m_nElementSize; i++)
{
pNewBuff[m_nElementSize + i] = ary.m_pBuff[i];
}
delete
[] m_pBuff;
m_pBuff = pNewBuff;
m_nBuffSize += ary.m_nBuffSize;
m_nElementSize += ary.m_nElementSize;
return
*
this
;
}
CArrary& CArrary::operator=(
const
CArrary & ary)
{
if
(
this
== &ary)
{
return
*
this
;
}
m_pBuff =
new
char
[ary.m_nBuffSize];
for
(
int
i = 0; i < ary.m_nElementSize; i++)
{
m_pBuff[i] = ary.m_pBuff[i];
}
m_nElementSize = ary.m_nElementSize;
m_nBuffSize = ary.m_nBuffSize;
return
*
this
;
}
int
CArrary::Find(
int
val)
{
for
(
int
i = 0; i < m_nElementSize; i++)
{
if
(m_pBuff[i] == val)
{
return
i;
}
}
return
-1;
}
int
CArrary::Size()
const
{
return
m_nElementSize;
}
void
CArrary::Clear()
{
if
(m_pBuff !=
nullptr
)
{
delete
[] m_pBuff;
m_pBuff =
nullptr
;
m_nBuffSize = 0;
m_nElementSize = 0;
}
}