C++實現一個數組類及其stack適配器

來源:互聯網
上載者:User

一、問題描述:

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.