在處理大量資料時,傳統陣列因記憶體連續配置限制難以動態擴展,而鏈表雖然靈活但隨機存取效率低落。本文介紹一種創新的模板動態陣列實作,巧妙融合雙向鏈表與分塊陣列的優點,實現高速隨機索引與彈性記憶體管理的雙重優勢。
核心架構設計
此動態陣列的核心在於將資料分塊儲存於鏈表節點中。每個節點包含一個指向緩衝區的指標(C 版使用 void*,C++ 版採用模板),緩衝區大小於初始化時指定。例如設定區塊大小為 10,當資料量達 51-60 筆時,鏈表將包含 6 個節點。這種設計避免了大塊連續記憶體配置的困難,同時保持資料區塊的局部性。
圖一:動態陣列結構示意圖
關鍵介面規格 (C++ 版)
- Add(T newElement):新增單筆資料,回傳索引編號
- AddBatch(T* pElement, int count):批次新增資料,回傳成功與否
- Copy(CSArray& src):複製另一個動態陣列的資料(需相同資料型別)
- GetAt(int index):取得指定索引的資料值
- GetPtAt(int index):取得指定索引資料的指標(直接存取,需謹慎使用)
- GetSize():取得目前資料容量
- SetAt(int index, T& newElement):修改指定索引的資料
- InsertAt(int index, T newElement):插入資料(涉及大量資料遷移,不建議頻繁使用)
- RemoveAt(int index):刪除指定索引資料(同樣涉及資料遷移)
- RemoveAll():清空所有資料
- SetSize(int size):設定容量(僅允許擴大)
效能特點
透過分塊儲存與鏈表連結,此結構在記憶體利用率與存取速度間取得平衡。隨機索引時透過區塊跳躍式搜尋,大幅優於傳統鏈表的線性遍歷。程式碼提供 C 與 C++ 兩個版本,採開放授權可自由使用、修改、傳播。
原始碼下載
- C 語言版(模擬 C++ 模板與物件導向):
fteb_array.zip
- C++ 語言版:
sarray.zip