CArray实现机制

 

在 CArray中,有以下变量:

 

TYPE* m_pData;   // the actual array of data

int m_nSize;     // # of elements (upperBound - 1)

int m_nMaxSize;  // max allocated

int m_nGrowBy;   // grow amount

 

下图展示了各变量的含义:

CArray实现机制_第1张图片

 

代码的关键在添加和删除元素上。

当添加新元素时,如果添加新元素后数组长度大于 m_nGrowBy , 需要开辟新的更大的数组已容纳更多元素,这时操作如下:

  1. 开辟一段内存以容纳新数组

TYPE* pNewData = (TYPE*) new BYTE[(size_t)nNewMax * sizeof (TYPE)];

  1. 拷贝以前的数组内容

::ATL::Checked::memcpy_s(pNewData, ……, m_pData, ……);

  1. 对其他的元素调用默认构造函数

::new ( (void *)( pNewData + m_nSize + i ) ) TYPE;

  1. 释放以前的数组空间

delete [] (BYTE*)m_pData;

  1. 调用拷贝构造函数来给新元素附值

m_pData[nIndex] = newElement;

 

而删除元素时,仅仅调用元素的析构函数,再将 m_nSize 减 1。

m_pData->~TYPE();

 

STL中的 vector在这些算法上基本和 CArray一致,只是 vector支持迭代器,可以与 algorithm中的算法结合,使得 vector的功能更加强大。

你可能感兴趣的:(c++)