日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DynamicList

發布時間:2025/4/5 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DynamicList 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1 繼承關系圖和接口實現
    • 2 代碼實現
    • 3 順序存儲線性表的分析

1 繼承關系圖和接口實現

DynamicList設計要點:
當前類當然是類模板

  • 申請連續堆空間作為順序存儲空間
  • 動態設置順序存儲空間的大小
  • 保證重置順序存儲空間時的異常安全性

函數異常安全的概念:

  • 不泄露任何資源
  • 不允許破壞數據

函數異常安全的基本保證:
如果異常被拋出,對象內的任何成員仍然保持有效狀態,并且沒有數據的破壞及資源泄露。

DynamicList接口實現:

template < typename T > class DynamicList : public SeqList<T> { protected:int m_capacity; // 順序存儲空間的大小public:DynamicList(int capacity); // 申請空間int capacity() const;void resize(int capacity); // 重新設置存儲空間的大小~DynamicList(); // 歸還空間 };

DynamicList繼承類圖:


2 代碼實現

DynamicList.h

#ifndef DYNAMICLIST_H #define DYNAMICLIST_H#include "Seqlist.h" #include "Exception.h"namespace LemonLib {template < typename T > class DynamicList : public SeqList<T> { protected:int m_capacity;public:DynamicList(int capacity){this->m_array = new T[capacity];if (this->m_array != NULL){this->m_length = 0;m_capacity = capacity;}else{THROW_EXCEPTION(NoEnoughMemoryException, "No enough memory to new DynamicList object...");}}int capacity() const{return m_capacity;}void resize(int capacity){if (capacity != m_capacity){T* array = new T[capacity];if (array != NULL){int len = (this->m_length < capacity) ? this->m_length : capacity;for (int i=0; i<len; i++){array[i] = this->m_array[i]; /* 賦值發生異常時,捕獲異常后,當前對象仍然是可用的,保證了異常安全 */}T* temp = this->m_array;this->m_array = array;this->m_length = len;this->m_capacity = capacity;delete[] temp; /* 之所以最后才delete是為了防止delete時調用析構函數,*//* 而析構函數中拋出異常導致當前對象構造不完全 *//* 保證異常安全 */}}}~DynamicList(){delete[] this->m_array;} };}#endif // DYNAMICLIST_H

測試代碼main.cpp

#include <iostream> #include "Object.h" #include "Exception.h" #include "List.h" #include "Seqlist.h" #include "Staticlist.h" #include "Dynamiclist.h"using namespace std; using namespace LemonLib;int main() {DynamicList<int> sl(5);for (int i=0; i<sl.capacity(); i++){sl.insert(0, i);}for (int i=0; i<sl.length(); i++){cout << sl[i] << endl;}sl.remove(3);for (int i=0; i<sl.length(); i++){cout << sl[i] << endl;}try{sl[5] = 0;}catch (const Exception& e){cout << e.message() << endl;cout << e.location() << endl;}return 0; }

3 順序存儲線性表的分析

下面的代碼是否正確?

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

分析: 上面的代碼是有很大的問題的。DynamicList<int> d2 = d1這句話是實際上是進行了拷貝構造,顯然這里是淺拷貝。那么,d1和d2的m_array將會指向同一片堆空間,那么d2進行的操作將會覆蓋d1進行的操作。

解決辦法: 對于容器類型的類,可以考慮禁用拷貝構造和賦值操作(直接在List類中進行相關處理即可)。

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的DynamicList的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。