最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ 動態(tài)數(shù)組模版類Vector實例詳解

 更新時間:2022年02月25日 16:00:43   作者:諾謙  
這篇文章主要為大家詳細介紹了C++動態(tài)數(shù)組模版類Vector實例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

1.實現(xiàn)機制

內(nèi)部主要通過m_capacity數(shù)組容量成員和m_length數(shù)組有效長度成員來維護一個T* data數(shù)組空間.

內(nèi)部默認分配一定數(shù)量大小的數(shù)組指針,每次append尾部追加的時候,無需再次分配空間,直接賦值標志length長度,假如超過當前空間容量,則再次擴大分配新的內(nèi)存數(shù)組,并將舊數(shù)組拷貝至新數(shù)組及釋放舊數(shù)組.

Vector需要實現(xiàn)的public函數(shù)如下所示:

  • inline int capacity() 獲取容量
  • inline int length() : 獲取有效長度
  • void resize(int asize) : 改變數(shù)組的有效長度
  • void append(const T &t) : 尾部追加一個元素
  • T& operator[] (int i) : 通過[]獲取元素
  • T operator[] (int i) const : 通過[]獲取常量元素
  • void clear() :清空數(shù)組中的數(shù)據(jù)
  • inline bool isEmpty(): 數(shù)組是否有數(shù)據(jù)

resize()函數(shù)實現(xiàn)細節(jié):

  • 如果resize長度大于當前容量時 : 則擴大分配新的內(nèi)存數(shù)組,并將舊數(shù)組拷貝至新數(shù)組及釋放舊數(shù)組.
  • 如果resize長度小于當前l(fā)ength時 : 則需要將多余的成員進行釋放,調(diào)用析構(gòu)函數(shù)實現(xiàn).
  • 如果resize長度大于當前l(fā)ength時 : 則需要調(diào)用默認構(gòu)造函數(shù)來填充內(nèi)部數(shù)組.

2.代碼實現(xiàn)

#ifndef VECTOR_H
#define VECTOR_H
#include "throw.h"
// throw.h里面定義了一個ThrowException拋異常的宏,如下所示:
//#include <iostream>
//using namespace std;
//#define ThrowException(errMsg)  {cout<<__FILE__<<" LINE"<<__LINE__<<": "<<errMsg<<endl; (throw errMsg);}
template <typename T>
class Vector
{
    T* m_data;
    int m_length;       // 有效數(shù)據(jù)的長度
    int m_capacity;     // 分配容量的長度
    // 分配
    T* allocate(int size)
    {
        T* arr = new T[size];
        if(arr == NULL) {
            ThrowException( "No memory to create DynamicArray object ...");
        }
        return arr;
    }
    // 重新分配
    void realloc(int capacity)
    {
        T* newData = allocate(capacity);
        for(int i=0; i<m_length; i++) {
            newData[i] = m_data[i];
        }
        delete[] m_data;
        m_data = newData;
        m_capacity = capacity;
    }
    // 調(diào)用析構(gòu)函數(shù)
    void destruct(int from, int end)
    {
        while(from++<end) {
           m_data[from].~T();
        }
    }
    // 調(diào)用默認構(gòu)造函數(shù)
    void defaultConstruct(int from, int end)
    {
        while(from++<end) {
           m_data[from] = T();
        }
    }
public:
    Vector(int lenght = 50)  { m_length = 0; m_data = allocate(lenght); m_capacity = lenght; }
    inline int capacity() const { return m_capacity; }     // 獲取容量
    inline int size()  { return m_length; }         // 獲取有效長度
    inline int length()  { return size(); }
    inline T *data() {  return m_data; }
    inline const T *data() const { return m_data; }
    inline bool isEmpty() const { return m_length == 0; }
    void clear()
    {
        if(!m_length) return;
        destruct(0, m_length);
        m_length = 0;
    }
    void resize(int asize)
    {
        if(asize == m_length) return;
        // 重新分配的大小>當前容量時
        if(asize > m_capacity) {
            realloc(asize);
        }
        if (asize < m_length)    // 分配的大小<當前大小時,則調(diào)用析構(gòu)
            destruct(asize, m_length);
        else        // 分配的大小>當前大小時,則調(diào)用默認構(gòu)造
            defaultConstruct(m_length, asize);
        m_length = asize;
    }
    // 尾部追加一個元素
    void append(const T &t)
    {
        if(m_length == m_capacity) {
            realloc(m_capacity+20);     // 如果容量滿了,則默認增加20個容量.方便后面append無需再次分配內(nèi)存
        }
        m_data[m_length] = t;
        m_length++;
    }
    T& operator[] (int i)
    {
        if((0 <= i) && (i < length()))
        {
            return m_data[i];
        }
        else
        {
            ThrowException("Parameter i is invalid ...");
        }
    }
    T operator[] (int i) const
    {
        return m_data[i];
    }
};
#endif // VECTOR_H

3.測試運行

測試如下所示:

class Test {
public:
    int number;
    Test(int n = 0) {
        number = n;
    }
};
int main(int argc, char *argv[])
{
   Vector<Test> arr;
   for(int i = 0; i < 10; i++)
       arr.append(Test(i));
   cout<<"********* Arr Len:"<<arr.length()<<" capacity:"<<arr.capacity()<<endl;
   for(int i = 0; i < arr.length(); i++)
       cout<<"arr []:"<<arr[i].number<<endl;
   cout<<"*********"<<endl;
   arr.resize(13);
   cout<<"********* Arr Len:"<<arr.length()<<" capacity:"<<arr.capacity()<<endl;
   for(int i = 0; i < arr.length(); i++)
       cout<<"arr []:"<<arr[i].number<<endl;
   cout<<"*********"<<endl;
   arr.resize(5);
   cout<<"********* Arr Len:"<<arr.length()<<" capacity:"<<arr.capacity()<<endl;
   for(int i = 0; i < arr.length(); i++)
       cout<<"arr []:"<<arr[i].number<<endl;
   cout<<"*********"<<endl;
    return 0;
}

運行如下所示:

可以看到我們resize(13)后,由于 resize長度大于當前arr的length,所以則調(diào)用默認構(gòu)造函數(shù)來填充內(nèi)部數(shù)組.所以arr[10]至arr[12]的number為0。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!  

相關(guān)文章

  • C語言冒泡排序算法代碼詳解

    C語言冒泡排序算法代碼詳解

    大家好,本篇文章主要講的是C語言冒泡排序算法代碼詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C語言詳解鏈式隊列與循環(huán)隊列的實現(xiàn)

    C語言詳解鏈式隊列與循環(huán)隊列的實現(xiàn)

    隊列(Queue)與棧一樣,是一種線性存儲結(jié)構(gòu),它具有如下特點:隊列中的數(shù)據(jù)元素遵循“先進先出”(First In First Out)的原則,簡稱FIFO結(jié)構(gòu)。在隊尾添加元素,在隊頭刪除元素,本篇來講解鏈式隊列與循環(huán)隊列的實現(xiàn)
    2022-04-04
  • Linux下Select多路復用實現(xiàn)簡易聊天室示例

    Linux下Select多路復用實現(xiàn)簡易聊天室示例

    大家好,本篇文章主要講的是Linux下Select多路復用實現(xiàn)簡易聊天室示例,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Qt操作SQLite數(shù)據(jù)庫的教程詳解

    Qt操作SQLite數(shù)據(jù)庫的教程詳解

    SQLite是一款開源、輕量級、跨平臺的數(shù)據(jù)庫,無需server,無需安裝和管理配置。它的設計目標是嵌入式的,所以很適合小型應用,也是Qt應用開發(fā)種常用的一種數(shù)據(jù)庫。本文為大家介紹了Qt操作SQLite數(shù)據(jù)庫的示例,希望對大家有所幫助
    2022-12-12
  • C++?重載運算符在HotSpot?VM中的應用小結(jié)

    C++?重載運算符在HotSpot?VM中的應用小結(jié)

    C++支持運算符重載,對于Java開發(fā)者來說,這個可能比較陌生一些,因為Java不支持運算符重載,下面介紹一下HotSpot?VM中的運算符重載,感興趣的朋友跟隨小編一起看看吧
    2023-09-09
  • C++實踐分數(shù)類中運算符重載的方法參考

    C++實踐分數(shù)類中運算符重載的方法參考

    今天小編就為大家分享一篇關(guān)于C++實踐分數(shù)類中運算符重載的方法參考,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • C++11 模板參數(shù)的“右值引用”是轉(zhuǎn)發(fā)引用嗎

    C++11 模板參數(shù)的“右值引用”是轉(zhuǎn)發(fā)引用嗎

    這篇文章主要介紹了C++11 模板參數(shù)的“右值引用”是轉(zhuǎn)發(fā)引用嗎,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • C++使用QTcreator創(chuàng)建動態(tài)庫流程

    C++使用QTcreator創(chuàng)建動態(tài)庫流程

    在工程中,經(jīng)常會根據(jù)不同的場景需求將類封裝成庫文件,本文主要介紹了C++使用QTcreator創(chuàng)建動態(tài)庫流程,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • C語言修煉之路初識指針陰陽竅?地址還歸大道真上篇

    C語言修煉之路初識指針陰陽竅?地址還歸大道真上篇

    指針是指向另一個變量的變量。意思是一個指針保存的是另一個變量的內(nèi)存地址。換句話說,指針保存的并不是普通意義上的數(shù)值,而是另一個變量的地址值。一個指針保存了另一個變量的地址值,就說這個指針“指向”了那個變量
    2022-02-02
  • C++11實現(xiàn)字符串分割的示例

    C++11實現(xiàn)字符串分割的示例

    本文主要介紹了C++11實現(xiàn)字符串分割的示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論

江源县| 含山县| 永安市| 资源县| 容城县| 甘孜| 扶余县| 青河县| 紫阳县| 乌苏市| 武强县| 壶关县| 巴青县| 华池县| 吴江市| 玉环县| 剑川县| 浏阳市| 兴隆县| 班戈县| 修水县| 安多县| 洪泽县| 许昌县| 临夏县| 突泉县| 桃源县| 霍林郭勒市| 武夷山市| 吐鲁番市| 崇阳县| 尼勒克县| 武功县| 栖霞市| 宁南县| 兴文县| 麟游县| 通辽市| 七台河市| 长兴县| 深泽县|