成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

自定義數(shù)據(jù)結構(C++)-創(chuàng)新互聯(lián)

1. 動態(tài)數(shù)組
#includetemplateclass MyVector
{
    T* m_p;
    int m_capacity;
    int m_size;

public:
    // 構造函數(shù)
    explicit MyVector() :m_p(NULL), m_capacity(0), m_size(0) {}
    explicit MyVector(int capacity) 
        :m_p(NULL), m_size(0) 
    {
        m_capacity = std::max(0, capacity);
    }
    explicit MyVector(int size, const T& value)
        :m_capacity(size), m_size(size)
    {
        m_size = std::max(0, size);

        m_p = new T[m_capacity];
        for (int i = 0; i< m_size; ++i)
            m_p[i] = value;
    }
    MyVector(const MyVector& myVector)
    {
        Ctor_Helper(myVector);
    }
    void operator=(const MyVector& myVector)
    {
        Ctor_Helper(myVector);
    }

    // 析構函數(shù)
    virtual ~MyVector()
    {
        if (m_p != NULL)
            delete[] m_p;
    }

    int Capacity()
    {
        return m_capacity;
    }

    int Size()
    {
        return m_size;
    }

    void Reserve(int newCapacity) // 新容量大小不能小于數(shù)據(jù)個數(shù)
    {
        bool paramsIsValid = (0<= newCapacity && m_size<= newCapacity);
        (!!paramsIsValid) || std::cout<< "(錯誤)第"<< __LINE__<< "行: "<< "Reserve操作, 無效參數(shù)\n";
        if (!paramsIsValid) return;

        if (m_capacity == 0)
        {
            m_capacity = newCapacity;
            m_p = new T[m_capacity];
        }
        else
        {
            m_capacity = newCapacity;
            T* tmp_p = new T[m_capacity];
            memcpy(tmp_p, m_p, m_size * sizeof(T));
            delete[] m_p;
            m_p = tmp_p;
        }
    }

    bool Empty()
    {
        return m_size == 0;
    }

    void Print()
    {
        for (int i = 0; i< m_size; ++i)
            std::cout<< m_p[i]<< ' ';
        std::cout<< '\n';
    }

    T& operator[](int idx)
    {
        bool paramsIsValid = (0<= idx && idx< m_size);
        (!!paramsIsValid) || std::cout<< "(錯誤)第"<< __LINE__<< "行: "<< "[]操作, 下標越界\n";
        if (!paramsIsValid) exit(1);
        return m_p[idx];
    }
    const T& operator[](int idx) const
    {
        bool paramsIsValid = (0<= idx && idx< m_size);
        (!!paramsIsValid) || std::cout<< "(錯誤)第"<< __LINE__<< "行: "<< "[]操作, 下標越界\n";
        if (!paramsIsValid) exit(1);

        return m_p[idx];
    }

    void Insert(int idx, const MyVector& otherVector, int otherIdx, int cnt)
    {
        Insert_Helper(idx, cnt);

        for (int i = 0; i< cnt; ++i)
            m_p[idx + i] = otherVector[otherIdx + i];
    }
    void Insert(int idx, const MyVector& otherVector, int otherIdx)
    {
        Insert_Helper(idx, otherVector.m_size);
    }
    void Insert(int idx, int cnt, const T& value)
    {
        Insert_Helper(idx, cnt);

        for (int i = 0; i< cnt; ++i)
            m_p[idx + i] = value;
    }
    void Insert(int idx, const T& value)
    {
        Insert(idx, 1, value);
    }
    void Insert(const T& value)
    {
        Insert(m_size, 1, value);
    }

    void Remove(int idx, int cnt)
    {
        bool paramsIsValid = (0<= idx && cnt >= 1 && idx + cnt - 1< m_size);
        (!!paramsIsValid) || std::cout<< "(錯誤)第"<< __LINE__<< "行: "<< "Remove操作, 無效參數(shù)\n";
        if (!paramsIsValid) return;

        for (int i = idx + cnt; i< m_size; ++i)
            m_p[i - cnt] = m_p[i];
        m_size -= cnt;
    }
    void Remove(int idx)
    {
        Remove(idx, 1);
    }
    void Remove() // 移除一個尾部元素
    {
        Remove(m_size - 1, 1);
    }
    void Clear()
    {
        m_size = 0;
    }

private:
    void Ctor_Helper(const MyVector& myVector)
    {
        if (m_p != NULL)
            delete[] m_p;

        m_capacity = myVector.m_capacity;
        m_size = myVector.m_size;
        m_p = new T[m_capacity];
        memcpy(m_p, myVector.m_p, m_size * sizeof(T));
    }
    void Insert_Helper(int idx, int cnt)
    {
        bool paramsIsValid = (0<= idx && cnt >= 1 && idx<= m_size && INT32_MAX - m_size >= cnt);
        (!!paramsIsValid) || std::cout<< "(錯誤)第"<< __LINE__<< "行: "<< "Insert操作, 無效參數(shù)\n";
        if (!paramsIsValid || m_capacity == INT32_MAX) return;

        m_size += cnt;
        if (m_capacity == 0)
        {
            m_capacity = m_size;
            m_p = new T[m_capacity];
        }
        else
        {
            bool addCapacity = false;
            while (m_size >m_capacity)
            {
                int tmp = (m_capacity<< 1);
                if (tmp >m_capacity)
                    m_capacity = tmp;
                else
                    m_capacity = INT32_MAX;

                addCapacity = true;
            }
            if (addCapacity)
            {
                T* tmp_p = new T[m_capacity];
                memcpy(tmp_p, m_p, m_size * sizeof(T));
                delete[] m_p;
                m_p = tmp_p;
            }

            // 從p[idx]到p[m_size - cnt - 1]的所有元素后移cnt位
            for (int i = idx; i< m_size - cnt; ++i)
                m_p[i + cnt] = m_p[i];
        }
    }
};

int main()
{
    MyVectormyVector;

    std::cout<< myVector[-1]<< '\n';
    myVector.Print();
}

? 上面程序中[ ]操作下標越界,會直接終止程序(exit(1))。

創(chuàng)新互聯(lián) - 托管服務器,四川服務器租用,成都服務器租用,四川網(wǎng)通托管,綿陽服務器托管,德陽服務器托管,遂寧服務器托管,綿陽服務器托管,四川云主機,成都云主機,西南云主機,托管服務器,西南服務器托管,四川/成都大帶寬,服務器機柜,四川老牌IDC服務商

? 用下面的變量來存儲T類型的默認值,可以只中斷函數(shù)不中斷程序,但會耗費更多的內(nèi)存,如果在m_p不為NULL時釋放tDefaultValue的內(nèi)存則會耗費更多的時間。

...代碼...
templateclass MyVector
{
    T* m_p;
    int m_capacity;
    int m_size;
    T* tDefaultValue = new T[1]{}; // 存儲T類型的默認值
    ...代碼...
    T& operator[](int idx)
    {
        bool paramsIsValid = (0<= idx && idx< m_size);
        (!!paramsIsValid) || std::cout<< "(錯誤)第"<< __LINE__<< "行: "<< "[]操作, 下標越界\n";
        if (!paramsIsValid) return tDefaultValue[0];
        return m_p[idx];
    }
    ...代碼...
};
...代碼...

安全性與性能,空間與時間,需要在設計的時候進行權衡。

例如:在重載[ ]操作的函數(shù)中,我們檢測了參數(shù)無效的情況,并輸出錯誤提示,[ ]操作函數(shù)提前中斷;有參構造函數(shù)中,我們直接處理了參數(shù)無效的情況,沒有輸出錯誤提示。而引入tDefaultValue變量可以防止因為一個BUG而導致整個程序跑不起來(雖然并不是一定能成功……)。

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

文章標題:自定義數(shù)據(jù)結構(C++)-創(chuàng)新互聯(lián)
文章鏈接:http://jinyejixie.com/article30/dpeiso.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、App開發(fā)服務器托管、App設計虛擬主機定制開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
大同县| 周口市| 卢龙县| 米泉市| 繁昌县| 垦利县| 广灵县| 于都县| 呼玛县| 息烽县| 岳西县| 小金县| 长治县| 陆河县| 白河县| 出国| 德安县| 当雄县| 南康市| 阳山县| 利辛县| 汝阳县| 湘阴县| 沐川县| 嘉义县| 藁城市| 和硕县| 大化| 乌恰县| 平谷区| 平顺县| 五原县| 哈密市| 湟中县| 靖西县| 莲花县| 莎车县| 茌平县| 棋牌| 民乐县| 绍兴县|