[C++11笔记001]修改通用库中的XDynamicArray,使它可以支持C++11的初始化列表和for循环

54 篇文章 3 订阅
今天,有空翻了一下<C++Primer plus(第六版)>,看到里面有介绍新的for循环和初始化列表,但是我实现的动态数组XDynamicArray不支持这些新特性,没办法,只好进行改造了。
首先是for循环,如下面的样式
for(auto e:stList)
{
    cout<<e<<endl;
}
是于就各种google,和查找C++11的array的源代码,总结:就是提供一个标准的iterator和begin,end这两个方法,就可以了。
是于定义了一个iterator
     // 一个数组的Array的Iterator类
     /*
        这里提供XArrayIterator这个类,目的是使得这里支持C++11的for循环
    
*/
    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(&paramArray)
        {}

        XArrayIterator( const XArrayIterator<Array> & paramR)
            :m_Index(paramR.m_Index), m_Array(paramR.m_Array)
        {}

        XArrayIterator &  operator = ( const XArrayIterator<Array> & paramR)
        {
             if ( this != &paramR)
            {
                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两个方法
typedef XArrayIterator<XDynamicArray<T> > iterator
         /* 这里定义begin和end主要有两个目的
            目的1:使它可以像标准STD容器那样遍历
            目的2:使它可以支持C++11的for循环
            例子:
            XDynamicArray<int> st;
            for(auto x:st)
            {
                cout<<x<<endl;
            }
        
*/
        iterator begin() 
        {
            iterator stRet( thisthis->getFirstIndex());
             return stRet;
        }

        iterator end() 
        {
            iterator stRet( this, ARRAY_INVALID_INDEX);
             return stRet;
        }
这样就可以了,测试通过。你们也可以试试。
C++11的另一个特性,就是新初始化列表,如下面例子
vector st {1,2,3,4,5};
看起来有点意思,于是又google一下,翻阅了各位大神的贴子,最终找到,然后我就实现了。这部分需要使用C++11的initializer_list模板类,具体使用代码如下。
         // 这个构造函数的定义,是为了实现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>
上述代码,已经放到我的开放库中了,大家可以自行下载。 我的开放代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值