網(wǎng)站首頁 編程語言 正文
1.實現(xiàn)機(jī)制
內(nèi)部主要通過m_capacity數(shù)組容量成員和m_length數(shù)組有效長度成員來維護(hù)一個T* data數(shù)組空間.
內(nèi)部默認(rèn)分配一定數(shù)量大小的數(shù)組指針,每次append尾部追加的時候,無需再次分配空間,直接賦值標(biāo)志length長度,假如超過當(dāng)前空間容量,則再次擴(kuò)大分配新的內(nèi)存數(shù)組,并將舊數(shù)組拷貝至新數(shù)組及釋放舊數(shù)組.
Vector需要實現(xiàn)的public函數(shù)如下所示:
-
inline int capacity()
:?獲取容量 -
inline int length() :?
獲取有效長度 -
void resize(int asize) :?
改變數(shù)組的有效長度 -
void append(const T &t) :
?尾部追加一個元素 -
T& operator[] (int i) :?
通過[]獲取元素 -
T operator[] (int i) const :
?通過[]獲取常量元素 -
void clear() :
清空數(shù)組中的數(shù)據(jù) -
inline bool?isEmpty():
?數(shù)組是否有數(shù)據(jù)
resize()函數(shù)實現(xiàn)細(xì)節(jié):
- 如果resize長度大于當(dāng)前容量時 :?則擴(kuò)大分配新的內(nèi)存數(shù)組,并將舊數(shù)組拷貝至新數(shù)組及釋放舊數(shù)組.
- 如果resize長度小于當(dāng)前l(fā)ength時 :?則需要將多余的成員進(jìn)行釋放,調(diào)用析構(gòu)函數(shù)實現(xiàn).
- 如果resize長度大于當(dāng)前l(fā)ength時 :?則需要調(diào)用默認(rèn)構(gòu)造函數(shù)來填充內(nèi)部數(shù)組.
2.代碼實現(xiàn)
#ifndef VECTOR_H #define VECTOR_H #include "throw.h" // throw.h里面定義了一個ThrowException拋異常的宏,如下所示: //#include//using namespace std; //#define ThrowException(errMsg) {cout<<__FILE__<<" LINE"<<__LINE__<<": "< class Vector { T* m_data; int m_length; // 有效數(shù)據(jù)的長度 int m_capacity; // 分配容量的長度 // 分配 T* allocate(int size) { T* arr = new T[size]; if(arr == NULL) { ThrowException( "No memory to create DynamicArray object ..."); } return arr; } // 重新分配 void realloc(int capacity) { T* newData = allocate(capacity); for(int i=0; i 當(dāng)前容量時 if(asize > m_capacity) { realloc(asize); } if (asize < m_length) // 分配的大小<當(dāng)前大小時,則調(diào)用析構(gòu) destruct(asize, m_length); else // 分配的大小>當(dāng)前大小時,則調(diào)用默認(rèn)構(gòu)造 defaultConstruct(m_length, asize); m_length = asize; } // 尾部追加一個元素 void append(const T &t) { if(m_length == m_capacity) { realloc(m_capacity+20); // 如果容量滿了,則默認(rèn)增加20個容量.方便后面append無需再次分配內(nèi)存 } m_data[m_length] = t; m_length++; } T& operator[] (int i) { if((0 <= i) && (i < length())) { return m_data[i]; } else { ThrowException("Parameter i is invalid ..."); } } T operator[] (int i) const { return m_data[i]; } }; #endif // VECTOR_H
3.測試運行
測試如下所示:
class Test { public: int number; Test(int n = 0) { number = n; } }; int main(int argc, char *argv[]) { Vectorarr; for(int i = 0; i < 10; i++) arr.append(Test(i)); cout<<"********* Arr Len:"<
運行如下所示:
可以看到我們resize(13)后,由于 resize長度大于當(dāng)前arr的length,所以則調(diào)用默認(rèn)構(gòu)造函數(shù)來填充內(nèi)部數(shù)組.所以arr[10]至arr[12]的number為0。
總結(jié)
原文鏈接:https://blog.csdn.net/qq_37997682/article/details/123111695
相關(guān)推薦
- 2022-06-01 python中parser.add_argument()用法實例(命令行選項、參數(shù)和子命令解析器)_
- 2022-06-12 詳解Flutter如何讀寫文本文件_Android
- 2023-10-16 el-popover在原生table中,彈出多個以及內(nèi)部取消按鈕無效問題
- 2022-05-08 Python+matplotlib實現(xiàn)堆疊圖的繪制_python
- 2023-03-05 Golang中tinyrpc框架的源碼解讀詳解_Golang
- 2022-11-05 Android?Jetpack組件中LifeCycle作用詳細(xì)介紹_Android
- 2022-04-02 Python面向?qū)ο蟮某绦蛟O(shè)計詳情_python
- 2022-05-22 PXE?kickstart自動化部署系統(tǒng)安裝_linux shell
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支