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

今天,有空翻了一下<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(this, this->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>

上述代码,已经放到我的开放库中了,大家可以自行下载。我的开放代码

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

时间: 2024-08-05 07:07:19

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

修改通用权限中的一个分页的BUG

BETWEEN {0} AND {1} 是两边数据都包含的,而RowNo是从1开始的,所以第一页的数据从0到50是正确的,但是第二页以及以后的页是从(x-1)*50到x*50的话,就会多出一条数据,需要在开始的位置+1,这样数据就正常了.

Google之Chromium浏览器源码学习——base公共通用库(三)

本节将介绍base公共通用库中的containers,其包含堆栈.列表.集合.以及Most Recently Used cache(最近使用缓存模板). linked_list.h:一个简单的列表类型,通过模板实现,内部采用双链表的形式,有区别于c++标准模板库的std::list<T*>,它的使用方式为:base::LinkedList<T>; 相对std::list<T*>,其优点有: 1. 删除一个元素,操作复杂度为O(1),而std::list<T*>

Google之Chromium浏览器源码学习——base公共通用库(二)

上次提到Chromium浏览器中base公共通用库中的内存分配器allocator,其中用到了三方库tcmalloc.jemalloc:对于这两个内存分配器,个人建议,对于内存,最好是自己维护内存池:此外在windows下使用可使用其自带的内存分配方式:具体的第三方库可以参阅:http://www.360doc.com/content/13/0915/09/8363527_314549128.shtml:目前我们主要的精力尽可能在Chromium浏览器中base公共通用库的主要内容上,所以不再详

使用ctypes调用C共享库中函数返回值为链表式结构时的方法

/*********************************************************************  * Author  : Samson  * Date    : 02/02/2015  * Test platform:  *              3.13.0-24-generic  *              GNU bash, 4.3.11(1)-release  * ************************************

STL笔记(6)标准库:标准库中的排序算法

STL笔记(6)标准库:标准库中的排序算法 标准库:标准库中的排序算法The Standard Librarian: Sorting in the Standard Library Matthew Austern http://www.cuj.com/experts/1908/austern.htm?topic=experts 用泛型算法进行排序    C++标准24章有一个小节叫“Sorting and related operations”.它包含了很多对已序区间进行的操作,和三个排序用泛型

MySQL生产库中添加修改表字段引起主从崩溃的问题总结

上周末和开发人员对线上库中的部分表的在线DDL和update,这过程中出现了一些意料之外的问题,现将过程.分析和解决方案在这里总结一下 一. 需求背景: 要在如下表中添加字段(modified_at)并且更改默认值 table_name { baby_compbaby_comp_statusbaby_usrbaby_ad_userbaby_campbaby_ordbaby_acc_eva } 每张表执行如下操作ALTER TABLE `$table_name` ADD COLUMN `modif

C++学习笔记18,C++11中的初始化列表构造函数(二)

C++11中的初始化列表构造函数(Initialize_list Constructors)是将std::initializer_list<T>作为第一个参数的构造函数,并且没有任何其他参数(或者其他参数具有默认值).例如: #include <iostream> #include <initializer_list>//必须包含该头文件 #include <vector> using namespace std; class A { private: ve

ObjectARX2010 学习笔记001:在新数据库中创建直线并将此数据库保存成DWG文件

static void swtArxProject5createLine(void) { // Add your code for command swtArxProject5.createLine here //创建新的CAD数据库 AcDbDatabase *pDb=new AcDbDatabase(); //定义块表指针 AcDbBlockTable *pBlkTbl; //获取块表 pDb->getSymbolTable(pBlkTbl,AcDb::kForRead); //定义块表记录

python基础教程_学习笔记15:标准库:一些最爱——fileinput

标准库:一些最爱 fileinput 重要的函数 函数 描述 input([files[,inplace[,backup]]) 便于遍历多个输入流中的行 filename() 返回当前文件的名称 lineno() 返回当前(累计)的名称 filelineno() 返回当前文件的行数 isfirstline() 检查当前行是否是文件的第一行 isstdin() 检查最后一行是否来自sys.stdin nextfile() 关闭当前文件,移动到下一个文件 close() 关闭序列 fileinput