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

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

public:
    // 構(gòu)造函數(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);
    }

    // 析構(gòu)函數(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ù)個(gè)數(shù)
    {
        bool paramsIsValid = (0<= newCapacity && m_size<= newCapacity);
        (!!paramsIsValid) || std::cout<< "(錯(cuò)誤)第"<< __LINE__<< "行: "<< "Reserve操作, 無(wú)效參數(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<< "(錯(cuò)誤)第"<< __LINE__<< "行: "<< "[]操作, 下標(biāo)越界\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<< "(錯(cuò)誤)第"<< __LINE__<< "行: "<< "[]操作, 下標(biāo)越界\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<< "(錯(cuò)誤)第"<< __LINE__<< "行: "<< "Remove操作, 無(wú)效參數(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() // 移除一個(gè)尾部元素
    {
        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<< "(錯(cuò)誤)第"<< __LINE__<< "行: "<< "Insert操作, 無(wú)效參數(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();
}

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

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

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

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

安全性與性能,空間與時(shí)間,需要在設(shè)計(jì)的時(shí)候進(jìn)行權(quán)衡。

例如:在重載[ ]操作的函數(shù)中,我們檢測(cè)了參數(shù)無(wú)效的情況,并輸出錯(cuò)誤提示,[ ]操作函數(shù)提前中斷;有參構(gòu)造函數(shù)中,我們直接處理了參數(shù)無(wú)效的情況,沒(méi)有輸出錯(cuò)誤提示。而引入tDefaultValue變量可以防止因?yàn)橐粋€(gè)BUG而導(dǎo)致整個(gè)程序跑不起來(lái)(雖然并不是一定能成功……)。

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

文章標(biāo)題:自定義數(shù)據(jù)結(jié)構(gòu)(C++)-創(chuàng)新互聯(lián)
文章鏈接:http://muchs.cn/article30/dpeiso.html

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

廣告

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

搜索引擎優(yōu)化