一维数组的简单封装 carray模板。

#ifndef CARRAY_HEADER
#define CARRAY_HEADER

//这个程序取材于 Bjarne Stroustrup 的《The C++ Programming Language》,后经过加强和改正。
//作者是:Piboye

#include <iterator>
namespace piboye
{
template<typename T,int n>
class carray
{
   char i_data[sizeof(T)*n];
public:
   typedef T value_type;
   typedef value_type * iterator;
   typedef value_type const * const_iterator;
   typedef std::reverse_iterator<iterator> reverse_iterator;
   typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
   typedef value_type & reference;
   typedef value_type const & const_reference;
   typedef value_type * pointer;
   typedef value_type const * const_pointer;
   typedef ptrdiff_t difference_type;
   typedef int size_type;
private:
   const_pointer cast()const {return reinterpret_cast<const_pointer>(i_data);}
   pointer cast() {return reinterpret_cast<pointer>(i_data);}
public:
 //Full Constructor
   carray (value_type const &a_1)  {
       for(int i=0;i<size();++i) {
          new (cast()+i) value_type(a_1);
       } 
   }

   template<typename T1>
   carray (T1 a_iter)  {
       for(int i=0;i<size();++i) {
          new (cast()+i) value_type(*a_iter);
          ++a_iter;
       }
   }

   carray(carray const & a_1) {
       for(int i=0;i<size();++i) {
          new (cast()+i) value_type(a_1[i]);
       }
   }
   carray & operator=(carray const & a_1) {
       for(int i=0;i<size();++i) {
           cast()[i]=a_1[i];
       }
       return *this;
   }
 //Destrcutor
   ~carray() {
       delete [] cast();
   }

    //iterator
   iterator begin() {
      return cast();
   }
   iterator end() {
      return cast()+size();
   }  
   const_iterator begin() const {
      return cast();
   }
   const_iterator end() const {
      return cast()+size();
   }

   //reverse_iterator
   reverse_iterator rbegin() {
      return reverse_iterator (cast()+size());
   }
   reverse_iterator rend() {
      return reverse_iterator(cast());
   }  
   const_reverse_iterator rbegin() const {
      return const_reverse_iterator (cast()+size());
   }
   const_reverse_iterator rend() const {
      return const_reverse_iterator(cast());
   }

   value_type & operator[](int a_index) {
      return cast()[a_index];
   }
   value_type const & operator[](int a_index) const {
      return cast()[a_index];
   }

   size_type size() const {
      return n;
   }
   value_type front() const {
      return cast()[0];
   }
   value_type  back() const {
      return cast()[size()-1];
   }

//Following is unsafted;

//Partition Constructor


}; // class carray ended

} // namespace piboye ended
#endif //CARRAY_HEADER

### 关于 `CArray3d` 三维数组模板类 尽管未找到直接针对 `CArray3d` 的具体实现细节,但可以根据其名称推测它可能是一个基于 MFC 或 STL 风格设计的三维数组模板类。通常情况下,这种类的设计目的是为了简化对三维数据结构的操作,并提供类型安全的支持。 以下是关于此类的一个假设性实现及其使用方法: #### 假设性的 `CArray3d` 类定义 ```cpp template<typename T> class CArray3d { public: // 构造函数:初始化三维数组大小 CArray3d(size_t dimX, size_t dimY, size_t dimZ) : m_dimX(dimX), m_dimY(dimY), m_dimZ(dimZ) { m_data.resize(m_dimX * m_dimY * m_dimZ); } // 设置元素值 void SetAt(size_t x, size_t y, size_t z, const T& value) { if (x >= m_dimX || y >= m_dimY || z >= m_dimZ) throw std::out_of_range("Index out of range"); m_data[Index(x, y, z)] = value; } // 获取元素值 T GetAt(size_t x, size_t y, size_t z) const { if (x >= m_dimX || y >= m_dimY || z >= m_dimZ) throw std::out_of_range("Index out of range"); return m_data[Index(x, y, z)]; } private: size_t Index(size_t x, size_t y, size_t z) const { return x + y * m_dimX + z * m_dimX * m_dimY; } std::vector<T> m_data; // 存储实际数据的一维向量 size_t m_dimX, m_dimY, m_dimZ; // 各维度大小 }; ``` #### 示例代码 以下是如何创建和操作一个 `CArray3d<int>` 对象的例子: ```cpp #include <iostream> #include <vector> int main() { try { // 创建一个尺寸为 3x4x5 的三维整数数组 CArray3d<int> array(3, 4, 5); // 设置一些值 array.SetAt(0, 0, 0, 100); array.SetAt(2, 3, 4, 999); // 获取并打印某些值 std::cout << "Value at (0, 0, 0): " << array.GetAt(0, 0, 0) << std::endl; std::cout << "Value at (2, 3, 4): " << array.GetAt(2, 3, 4) << std::endl; } catch (const std::exception& e) { std::cerr << "Error: " << e.what() << std::endl; } } ``` 此示例展示了如何通过索引来设置和获取三维数组中的值。如果尝试访问超出范围的索引,则会抛出异常[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值