本文地址:
http://www.shnenglu.com/zdhsoft/archive/2014/08/04/207906.html今天,有空翻了一下<C++Primer plus(第六版)>,看到里面有介紹新的for循環(huán)和初始化列表,但是我實(shí)現(xiàn)的動(dòng)態(tài)數(shù)組XDynamicArray不支持這些新特性,沒(méi)辦法,只好進(jìn)行改造了。
首先是for循環(huán),如下面的樣式
for(auto e:stList)
{
cout<<e<<endl;
}
是于就各種google,和查找C++11的array的源代碼,總結(jié):就是提供一個(gè)標(biāo)準(zhǔn)的iterator和begin,end這兩個(gè)方法,就可以了。
是于定義了一個(gè)iterator
//一個(gè)數(shù)組的Array的Iterator類
/*
這里提供XArrayIterator這個(gè)類,目的是使得這里支持C++11的for循環(huán)
*/
template<class Array>
class XArrayIterator
{
public:
typedef typename Array::ElementType & reference;
typedef typename Array::ElementType * pointer;
XArrayIterator()
:m_Index(ARRAY_INVALID_INDEX), m_Array(nullptr)
{}
XArrayIterator(Array * paramArray, XInt paramIndex)
:m_Index(paramIndex), m_Array(paramArray)
{}
XArrayIterator(Array & paramArray, XInt paramIndex)
:m_Index(paramIndex), m_Array(¶mArray)
{}
XArrayIterator(const XArrayIterator<Array> & paramR)
:m_Index(paramR.m_Index), m_Array(paramR.m_Array)
{}
XArrayIterator & operator = (const XArrayIterator<Array> & paramR)
{
if (this != ¶mR)
{
m_Index = paramR.m_Index;
m_Array = paramR.m_Array;
}
return *this;
}
XArrayIterator & operator = (Array * paramArray)
{
m_Array = paramArray;
if (isNotNULL(m_Array))
{
m_Array = m_Array->getFirstIndex();
}
else
{
m_Index = ARRAY_INVALID_INDEX;
}
return *this;
}
bool operator == (const XArrayIterator<Array> & paramR)
{
return m_Index == paramR.m_Index && m_Array == paramR.m_Array;
}
bool operator != (const XArrayIterator<Array> & paramR)
{
return m_Index != paramR.m_Index || m_Array != paramR.m_Array;
}
reference operator*()
{
return (*m_Array)[m_Index];
}
const reference operator*() const
{
return (*m_Array)[m_Index];
}
pointer operator->()
{
return &(*m_Array[m_Index]);
}
const pointer operator->() const
{
return &(*m_Array[m_Index]);
}
XArrayIterator & operator ++()
{
if (m_Index != ARRAY_INVALID_INDEX && isNotNULL(m_Array))
{
m_Index++;
if (m_Index >= m_Array->getLength()) m_Index = ARRAY_INVALID_INDEX;
}
return *this;
}
XArrayIterator operator ++(int)
{
XArrayIterator stRet = *this;
if (m_Index != ARRAY_INVALID_INDEX && isNotNULL(m_Array))
{
m_Index++;
if (m_Index >= m_Array->getLength()) m_Index = ARRAY_INVALID_INDEX;
}
return stRet;
}
XArrayIterator & operator --()
{
if (m_Index != ARRAY_INVALID_INDEX && isNotNULL(m_Array))
{
m_Index--;
if (m_Index < 0) m_Index = ARRAY_INVALID_INDEX;
}
return *this;
}
XArrayIterator operator --(int)
{
XArrayIterator stRet = *this;
if (m_Index != ARRAY_INVALID_INDEX && isNotNULL(m_Array))
{
m_Index--;
if (m_Index < 0) m_Index = ARRAY_INVALID_INDEX;
}
return stRet;
}
XArrayIterator & operator +=(XInt paramOffset)
{
if (m_Index != ARRAY_INVALID_INDEX && isNotNULL(m_Array))
{
m_Index += paramOffset;
if (!(m_Index >= 0 && m_Index < m_Array->getLength()))
{
m_Index = ARRAY_INVALID_INDEX;
}
}
return *this;
}
XArrayIterator operator + (XInt paramOffset) const
{
XArrayIterator stRet = *this;
stRet += paramOffset;
return stRet;
}
XArrayIterator & operator -=(XInt paramOffset)
{
return operator += (-paramOffset);
}
XArrayIterator operator - (XInt paramOffset) const
{
XArrayIterator stRet = *this;
stRet -= paramOffset;
return stRet;
}
private:
XInt m_Index;
Array * m_Array;
};
然后在XDynamicArray兩個(gè)方法
typedef XArrayIterator<XDynamicArray<T> > iterator
/*這里定義begin和end主要有兩個(gè)目的
目的1:使它可以像標(biāo)準(zhǔn)STD容器那樣遍歷
目的2:使它可以支持C++11的for循環(huán)
例子:
XDynamicArray<int> st;
for(auto x:st)
{
cout<<x<<endl;
}
*/
iterator begin()
{
iterator stRet(this, this->getFirstIndex());
return stRet;
}
iterator end()
{
iterator stRet(this, ARRAY_INVALID_INDEX);
return stRet;
}
這樣就可以了,測(cè)試通過(guò)。你們也可以試試。
C++11的另一個(gè)特性,就是新初始化列表,如下面例子
vector st {1,2,3,4,5};
看起來(lái)有點(diǎn)意思,于是又google一下,翻閱了各位大神的貼子,最終找到,然后我就實(shí)現(xiàn)了。這部分需要使用C++11的initializer_list模板類,具體使用代碼如下。
//這個(gè)構(gòu)造函數(shù)的定義,是為了實(shí)現(xiàn)C++11的初始化列表,如下例子
/*
XDynamicArray<int> st {1,2,3,4,5};
或 XDynamicArray<int> st = {1,2,3,4,5};
*/
XDynamicArray(std::initializer_list<T> paramList)
: m_Length(0),
m_Capacity(0),
m_Data(NULL)
{
this->ensureCapacity((XInt)paramList.size());
for (auto e : paramList)
{
Append(e);
}
}
使用initializer_list需要頭文件:#include <initializer_list>
上述代碼,已經(jīng)放到我的開(kāi)放庫(kù)中了,大家可以自行下載。
我的開(kāi)放代碼