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

順序存儲線性表的分析(八)-創(chuàng)新互聯

       我們在前面講解了 SeqList  線性表的相關特性,下來我們來分析下它的效率。如下

沙灣網站制作公司哪家好,找創(chuàng)新互聯建站!從網頁設計、網站建設、微信開發(fā)、APP開發(fā)、響應式網站開發(fā)等網站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯建站公司2013年成立到現在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網站建設就選創(chuàng)新互聯建站
template < typename T >
class SeqList : public List<T>
{
protected:
    T* m_array;        // 順序存儲空間
    int m_length;      // 當前線性表長度
public:
    bool insert(int i, const T& e);    // O(n)
    bool remove(int i);                // O(n)
    bool set(int i, const T& e);       // O(1)
    bool get(int i, T& e) const;       // O(1)
    int length() const;                // O(1)
    void clear();                      // O(1)
    
    // 順序存儲線性表的數組訪問方式
    T& operator[] (int i);             // O(1)
    T& operator[] (int i) const;       // O(1)
    
    // 順序存儲空間的容量 
    virtual int capacity() const = 0;
};

       那么問題來了,兩個長度相同的 SeqList ,插入和刪除操作的平均耗時是否相同呢?插入操作的大O表示法是 O(n + 5),等價于O(n);而刪除操作是 O(n-1) ,等價于 O(n)。從時間復雜度上來說,它們是相同的。我們再來想下,插入一個 int 類型的數字和插入一個 string 類型的字符串,兩個效率能一樣嗎?數字肯定是效率非常高的,但是字符串就涉及到字符串的 copy 了,因此效率肯定肯定沒有數字的高。

       接下來我們來看看下面代碼正確嗎?為什么?

StaticList<int*, 5> s1;
StaticList<int*, 5> s2;

for(int i=0; i<s1.capacity(); i++)
{
    s1.insert(0, new int(i));
}

s2 = s1;

for(int i=0; i<s1.capacity(); i++)
{
    delete s1[i];
    delete s2[i];
}

       我們咋一看,感覺這段代碼沒問題。申請了兩個 StaticList 類型的指針數組,然后再在 s1 中插入元素,將 s1  賦值給 s2,最后刪除兩個指針數組。我們仔細想想,在 s1 賦值給 s2 的時候,s2 同時也指向了 s1 數組的地址,再次進行兩個相同地址的釋放,難道代碼不會出錯嗎?肯定會啊。我們再來看看下面這段代碼正確嗎?

void func()
{
    DynamicList<int> d1(5);
    DynamicList<int> d2 = d1;
    
    for(int i=0; i<d1.capacity(); i++)
    {
        d1.insert(i, i);
        d2.insert(i, i*i);
    }
    
    for(int i=0; i<d1.capacity(); i++)
    {
        cout << d1[i] << endl;
    }
}

       我們在定義 d2 的時候,進行了拷貝構造,那么后面的插入操作便會出現問題。會將 d2 的操作覆蓋掉 d1 的結果,因此會出現我們不想看到的結果。

       那么對于容器類型的類,我們可以考慮禁用,方法是將它們都聲明為 protected 屬性就行。那么我們之前的 List 類代碼就可以優(yōu)化為這樣

template < typename T >
class List : public Object
{
protected:
    List(const List&);
    List& operator= (const List&);
public:
    List() {}
    virtual bool insert(const T& e) = 0;
    virtual bool insert(int i, const T& e) = 0;
    virtual bool remove(int i) = 0;
    virtual bool set(int i, const T& e) = 0;
    virtual bool get(int i, T& e) const = 0;
    virtual int length() const = 0;
    virtual void clear() = 0;
};

       將拷貝構造和賦值操作聲明為 protected,那么就不會出現上面的問題了。我們來看看下面的代碼正確嗎?

int main()
{
    StaticList<int, 5> list;
    
    for(int i=0; i<list.capacity(); i++)
    {
        list[i] = i * i;
    }
    
    return 0;
}

       在這份代碼中,我們將線性表當成數組來使用了,線性表必須先插入元素,才能使用操作符 [] 訪問元素。順序存儲結構線性表提供了數組操作符重載,通過重載能夠快捷方便的獲取目標位置處的數據元素,再具體的使用方式上類似數組,但是由于本質不同,不能代替數組使用。那么我們就有必要來開發(fā)一個數組類了。數組類的結構如下所示

順序存儲線性表的分析(八)

       通過今天的學習,總結如下:1、線性表作為容器類,應該避免拷貝構造和拷貝賦值;2、順醋存儲線性表可能被當成數組誤用。

分享標題:順序存儲線性表的分析(八)-創(chuàng)新互聯
本文來源:http://jinyejixie.com/article44/dedhee.html

成都網站建設公司_創(chuàng)新互聯,為您提供網站營銷云服務器、建站公司、虛擬主機、外貿建站、網站策劃

廣告

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

成都定制網站網頁設計
徐州市| 左云县| 利辛县| 汕尾市| 抚顺市| 平和县| 南岸区| 鲁甸县| 枣阳市| 莲花县| 临江市| 连南| 罗江县| 沾化县| 安庆市| 黄大仙区| 车致| 扶沟县| 唐山市| 彭泽县| 左权县| 盐城市| 信阳市| 盐津县| 墨玉县| 阜新| 靖西县| 简阳市| 梁河县| 乌鲁木齐县| 林周县| 育儿| 夏河县| 棋牌| 甘洛县| 易门县| 革吉县| 株洲县| 博爱县| 广宁县| 玉田县|