Chinaunix首页 | 论坛 | 博客
  • 博客访问: 341623
  • 博文数量: 208
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 286
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-20 11:39
文章分类

全部博文(208)

文章存档

2014年(208)

我的朋友

分类: LINUX

2014-05-20 12:22:29

我们设计动态数组的目的在于,利用C++模板技术,消除C++语言中对数组的种种限制,如数组无法成为函数的参数或返回值(除非是指针),数组无法直接赋值等等。

1 一维动态数组

 

一维动态数组将一个普通数组封装成data

 

来看具体实现:

 

  1. template <class T>  
  2. class Array  
  3. {  
  4. protected:  
  5.     T* data;  
  6.     unsigned int base;  
  7.     unsigned int length;  
  8.   
  9. public:  
  10.     Array ();  
  11.     Array (unsigned int, unsigned int = 0);  
  12.     ~Array ();  
  13.   
  14.     Array (Array const&);  
  15.     Array& operator = (Array const&);  
  16.   
  17.     T const& operator [] (unsigned intconst;  
  18.     T& operator [] (unsigned int);  
  19.   
  20.     T const* Data () const;  
  21.     unsigned int Base () const;  
  22.     unsigned int Length () const;  
  23.   
  24.     void SetBase (unsigned int);  
  25.     void SetLength (unsigned int);  
  26. };  
  27.   
  28. template <class T>  
  29. Array::Array() :  
  30. data (new T [0]),  
  31. base (0),  
  32. length (0)  
  33. {}  
  34.   
  35. template <class T>  
  36. Array::Array (unsigned int n, unsigned int m) :  
  37. data (new T [n]),  
  38. base (m),  
  39. length (n)  
  40. {}  
  41.   
  42. template <class T>  
  43. Array::Array (Array const& array) :  
  44. data (new T [array.length]),  
  45. base (array.base),  
  46. length (array.length)  
  47. {  
  48.     for (unsigned int i = 0; i < length; ++i)  
  49.     {  
  50.         data [i] = array.data [i];  
  51.     }  
  52. }  
  53.   
  54. template <class T>  
  55. Array::~Array ()  
  56. {   
  57.     delete [] data;   
  58. }  
  59.   
  60. template <class T>  
  61. const* Array::Data() const  
  62. {   
  63.     return data;   
  64. }  
  65.   
  66. template <class T>  
  67. unsigned int Array::Base() const  
  68. {   
  69.     return base;   
  70. }  
  71.   
  72. template <class T>  
  73. unsigned int Array::Length() const  
  74. {   
  75.     return length;   
  76. }  
  77.   
  78. template <class T>  
  79. const& Array::operator [] (unsigned int position) const  
  80. {  
  81.     unsigned int const offset = position - base;  
  82.     if (offset >= length)  
  83.     {  
  84.         throw out_of_range ("invalid position");  
  85.     }  
  86.   
  87.     return data [offset];  
  88. }  
  89.   
  90. template <class T>  
  91. T& Array::operator [] (unsigned int position)  
  92. {  
  93.     unsigned int const offset = position - base;  
  94.     if (offset >= length)  
  95.     {  
  96.         throw out_of_range ("invalid position");  
  97.     }  
  98.   
  99.     return data [offset];  
  100. }  
  101.   
  102. template <class T>  
  103. void Array::SetBase (unsigned int newBase)  
  104. {   
  105.     base = newBase;   
  106. }  
  107.   
  108. template <class T>  
  109. void Array::SetLength (unsigned int newLength)  
  110. {  
  111.     T* const newData = new T [newLength];  
  112.     unsigned int const min =  
  113.         length < newLength ? length : newLength;  
  114.     for (unsigned int i = 0; i < min; ++i)  
  115.     {  
  116.         newData [i] = data [i];  
  117.     }  
  118.   
  119.     delete [] data;  
  120.     data = newData;  
  121.     length = newLength;  
  122. }  


2 二维动态数组

 

二维动态数组的实现比一维数组更简单:

 

  1. template <class T>  
  2. class Array2D  
  3. {  
  4. protected:  
  5.     unsigned int numberOfRows;  
  6.     unsigned int numberOfColumns;  
  7.     Array* array;  
  8.   
  9. public:  
  10.     Array2D (unsigned int, unsigned int);  
  11.     //T& Select (unsigned int, unsigned int);  
  12.     Array const& operator[](unsigned int index) const//const版本  
  13.         return array[index]; //返回索引处的一维数组对象  
  14.     }  
  15.     Array& operator[](unsigned int index){ //非const版本  
  16.         return array[index]; //返回索引处的一维数组对象  
  17.     }  
  18. };  
  19.   
  20. template <class T>  
  21. Array2D::Array2D( unsigned int m, unsigned int n ):  
  22. numberOfRows (m),  
  23. numberOfColumns (n),  
  24. array (0)  
  25. {  
  26.     //为一维数组Array分配原始内存  
  27.     void* raw=::operator new[](numberOfColumns * sizeof(Array));  
  28.     array=static_cast*>(raw);  
  29.     //用placement new调用构造函数初始化各个元素的内存  
  30.     for(std::size_t i=0;i
  31.         new(array+i) Array(numberOfRows); 
阅读(305) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~