C++實戰:一個輕型數組類的實現

來源:互聯網
上載者:User

C++實戰:一個輕型數組類的實現

說明:這個數組類可視為標準庫中vector的簡化版:支援數組的一般操作,支援複製、賦值,支援重新定義大小; 不考慮多線程,不考慮預分配額外空間以進行的效能最佳化,不設定迭代器。

#include <iostream>                 // 僅用於測試時輸出,數組類本身不需要

template <typename Type>
class Array
{
public:
    typedef unsigned int size_tp;   // 數組的尺寸(下標)類型

    Array(size_tp size = 0, Type t = Type());     // 可以用size指定初始大小,t指定初始值
    Array(const Array& array);
    ~Array();                                     // 空間自動釋放

    Type& operator[](size_tp index);              // 下標訪問(讀/寫形式)
    const Type& operator[](size_tp index) const;  // 下標訪問(唯讀形式)
    Array& operator=(const Array& rhs);           // 賦值,改變大小/內容

    size_tp get_size() const;                     // 獲得數組大小
    void resize(size_tp size);                    // 重設數組大小,若改小,則丟棄尾資料

    void push_back(const Type& value);            // 追加一個數組元素,數組大小增一

private:
    void copy(const Type *p_source, Type *p_target, size_tp size);
    size_tp _size;
    Type *_arr;
};

template <typename Type>
Array<Type>::Array(size_tp size, Type t): _size(size), _arr(size ? new Type[size] : 0)
{
    for (size_tp i = 0; i < size; ++i)      // not executed if (size == 0)
 _arr[i] = t;
}

template <typename Type>
Array<Type>::Array(const Array& array):
_size(array._size),
_arr(array._size ? new Type[array._size] : 0)
{
    copy(_array._arr, _arr, array._size);  // do nothing if (array._size == 0)
}

template <typename Type>
Array<Type>::~Array()
{
    delete[] _arr;
}

template <typename Type>
Array<Type>& Array<Type>::operator=(const Array<Type>& rhs)
{
    if (&rhs != this)
    {
 resize(rhs._size);
 copy(rhs._arr, _arr, _size);
    }
    return *this;
}

template <typename Type>
Type& Array<Type>::operator[](size_tp index)
{
    if (index >= _size)
 throw("Array::out of range");
    return _arr[index];
}

template <typename Type>
const Type& Array<Type>::operator[](size_tp index) const
{
    if (index >= _size)
 throw("Array::out of range");
    return _arr[index];
}

template <typename Type>
Array<Type>::size_tp Array<Type>::get_size() const
{
    return _size;
}

template <typename Type>
void Array<Type>::copy(const Type *p_source, Type *p_target, size_tp size)
{
    for (size_tp i = 0; i < size; ++i)      // not executed if (size == 0)
 p_target[i] = p_source[i];
}

template <typename Type>
void Array<Type>::resize(size_tp new_size)
{
    if (new_size)
    {
 Type *p = new Type[new_size];
 copy(_arr, p, _size < new_size ? _size : new_size);
 delete[] _arr;
 _arr = p;
    }
    else
    {
 delete[] _arr;
 _arr = 0;
    }
    _size = new_size;
}

template <typename Type>
void Array<Type>::push_back(const Type& value)
{
    resize(_size + 1);
    _arr[_size - 1] = value;
}

int main()                 // 主測試函數
{
    Array<int> a(30, 5);
    Array<int> b;
    b.push_back(20);
    b.push_back(100);
    a = b;
    for (Array<int>::size_tp i = 0; i < a.get_size(); ++i)
 std::cout << a[i] << std::endl;
    return 0;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.