一、問題描述:
1、用C++實現一個數組類,類型和大小可設;提供越界檢查;支援整體賦值.......
2、為其提供棧介面適配功能,使其能作為std::stack的容器
二、問題分析:
......
三、實現
//////Nathan.Yu//2008-6-13////#ifndef __YARRAY_H__#define __YARRAY_H__#include <algorithm>namespace ylib{template <class T, size_t N>class YArray{public:// 類型定義 typedef T value_type; typedef T* iterator; typedef const T* const_iterator; typedef T& reference; typedef const T& const_reference; typedef std::size_t size_type; typedef std::ptrdiff_t difference_type;/*由於內部資料成員以數組形式存放(無指標類型成員),故無需解構函式。但若該數組中存放的是指標(即是一個指標數組),則需在外面手工delete掉各個元素,否則就會造成記憶體泄露*///拷貝構造、類型別參數的賦值操作函數都使用編譯器產生的預設函數public://預設建構函式:將數組的所有元素初始化為T()預設值,該值也可顯示提供//不用expliict,使YArray<int, 10> c=20;形式的語句也能通過/*explicit*/ YArray(const T& value = T()){for(int i=0; i<N; ++i)elems[i] = value;}//為實現T2不為T的類型的一般構造template <class T2>YArray(const YArray<T2,N>& rhs){std::copy(rhs.begin(), rhs.end(), (T*)elems);}//為實現T2不為T的類型的一般賦值template <class T2>YArray& operator=(const YArray<T2,N>& rhs){std::copy(rhs.begin(), rhs.end(), begin());return *this;}reference operator[](size_t i){CheckIndex(i);return elems[i];}const_reference operator[](size_t i) const{CheckIndex(i);return elems[i];}size_t size() const{return N;}iterator begin(){return elems;}const_iterator begin() const{return elems;}iterator end(){return elems+N;}const_iterator end() const{return elems+N;}//以某個值填充整個數組void fillwith(const T& value){std::fill_n(begin(), N, value);}// swap 類型必須相同<T, N> void swap (YArray<T, N>& rhs) {std::swap_ranges(begin(), end(), rhs.begin()); }T* c_array(){return elems;}const T* c_array() const{return elems;}private:void CheckIndex(int i) const{if(i<0 || i>=N)throw "ArrayIndexOutOfRange";}private:T elems[N];};//為上面的數組實現一個std::stack適用的堆棧適配器//即為stack實現其所需的基本要素(函數、介面)template <class T, size_t N>class YArrayStackAdapter{public:typedef T value_type; typedef T& reference; typedef const T& const_reference; typedef std::size_t size_type;public:YArrayStackAdapter():topIndex(0){}bool empty() const{return topIndex == 0;}size_t size() const{return a.size();}T& back(){if(topIndex == 0)throw std::exception("StackEmpty");return a[topIndex-1];}void push_back(const T& value){if(topIndex == N)throw std::exception("StackOverFlow");a[topIndex++] = value;}void pop_back(){if(topIndex == 0)throw std::exception("StackEmpty");--topIndex;}private:size_t topIndex;YArray<T, N> a;};}#endif