c++ vector模擬實現(xiàn)的全過程
一、vector是什么?
vector是表示可變大小數(shù)組的序列容器,它也采用連續(xù)存儲空間來存儲元素,因此可以采用下標對vector的元素進行訪問,它的大小是動態(tài)改變的,vector使用動態(tài)分配數(shù)組來存儲它的元素;
二、容器特性
1.順序序列
順序容器中的元素按照嚴格的線性順序排序。可以通過元素在序列中的位置訪問對應(yīng)的元素;
2.動態(tài)數(shù)組
支持對序列中的任意元素進行快速直接訪問,甚至可以通過指針進行該操作。操供了在序列末尾相對快速地添加/刪除元素的操作;
3.能夠感知內(nèi)存分配器的
容器使用一個內(nèi)存分配器對象來動態(tài)地處理它的存儲需求;
三、vector的模擬實現(xiàn)
定義一個類:
template<class T> class Vector { T* _start; //首元素地址 T* _finish; //最后一個元素地址的下一個地址 T* _endOfStorage; //空間的尾地址 public: //成員函數(shù) };
構(gòu)造函數(shù)
Vector() :_start(nullptr) , _finish(nullptr) , _endOfStorage(nullptr) {} Vector(size_t n, const T& value = T()) :_start(nullptr) , _finish(nullptr) , _endOfStorage(nullptr) { reserve(n); while (n--) { push_back(value); } } Vector(InputInterator first, InputInterator last) :_start(nullptr) , _finish(nullptr) , _endOfStorage(nullptr) { while (first != last) { pushBack(*first); ++first; } }
數(shù)據(jù)大小、空間大小
size_t size() const { return _finish - _start; } size_t capacity() const { return _endOfStorage - _start; }
尾插
void pushBack(const T& value) { if (_finish == _endOfStorage) { size_t newC = _endOfStorage == nullptr ? 1 : 2 * capacity(); reverse(value); } *_finish = value; ++_finish; }
擴容
有資源進行拷貝時,使用深拷貝;類型為自定義類型時,發(fā)生淺拷貝,調(diào)用自定義類型析構(gòu)函數(shù),釋放資源,導致資源二次釋放,所以自定義類型的拷貝有資源時進行深拷貝;
void reserve(size_t n) { if (n > capacity()) { size_t sz = size(); T* arr = new T[n]; if (_start) { memcpy(arr, _start, sizeof(T) * sz); delete[] _start; } //update _start = arr; _finish = _start + sz; _endOfStorage = _start + n; } }
改變數(shù)據(jù)大小
void resize(size_t n, const T& val = T()) { if (n > capacity()) { reserve(n); } else if (n > size()) { while (_finish != _start + n) { *_finish = val; _finish++; } } _finish = _start + n; }
位置插入值
void insert(iterator pos, const T& val) { size_t sz = pos - _start; //檢查位置 if (pos >= _start && pos <= _finish) { //檢查容量 if (_finish == _endOfStoage) { size_t n = _endOfStorage == nullptr ? 1 : 2 * capacity(); reserve(n); //更新迭代器 pos = _start + sz; } //移動元素 iterator end_u = _finish; while (end_u != pos) { *end = *(end_u - 1); --end_u(); } //插入元素 *pos = val; //更新位置 ++_finish; } }
刪除數(shù)據(jù)
iterator erase(iterator pos) { //檢查位置 if (pos < _finish && pos >= _start) { //移動元素 iterator start = pos + 1; while (start!=_finish) { *(start - 1) = *start; start++; } //更新 --_finish; } return pos; } //返回刪除數(shù)據(jù)的下一個元素的位置
operator[] 重載
T& operator[](size_t pos) { if (pos >= 0 && pos < size()) return _start[pos]; }
operator= 重載
Vector<T>& operator=(const Vector<T>& v) { if (this != &v) { delete[]_start; size_t n = v.capacity(); _start = new T[n]; for (size_t i = 0; i < v.capacity(); ++i) { _start[i] = v._start[i]; } _finish = _start + v.size(); _finish = _start + n; } return *this; }
迭代器
//vector迭代器:T* typedef T* iterator; typedef const T* const_iterator; iterator begin() { return _start; } iterator end() { return _finish; } const_iterator begin() const { return _start; } const_iterator end() const { return _finish; }
析構(gòu)函數(shù)
~Vector() { if (_start) { delete[] _start; _start = _finish = _endOfStorage = nullptr; } }
總結(jié)
到此這篇關(guān)于c++ vector模擬實現(xiàn)的文章就介紹到這了,更多相關(guān)c++ vector模擬實現(xiàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt中const?QString轉(zhuǎn)換?char?*可能的坑
本文主要介紹了Qt中const?QString轉(zhuǎn)換?char?*可能的坑,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07C++如何在一個函數(shù)內(nèi)返回不同類型(三種方法)
C++?中要在一個函數(shù)內(nèi)返回不同類型的值,你可以使用?C++17?引入的?std::variant?或?std::any,或者使用模板和多態(tài),下面將分別介紹這些方法,需要的朋友可以參考下2023-12-12C++將音頻PCM數(shù)據(jù)封裝成wav文件的方法
這篇文章主要為大家詳細介紹了C++將音頻PCM數(shù)據(jù)封裝成wav文件的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01Win10下最新版CLion(2020.1.3)安裝及環(huán)境配置教程詳解
這篇文章主要介紹了Win10下最新版CLion(2020.1.3)安裝及環(huán)境配置,CLion 是 JetBrains 推出的全新的 C/C++ 跨平臺集成開發(fā)環(huán)境,本文給大家介紹的非常詳細,需要的朋友可以參考下2020-08-08一文詳解如何在VS?Code上搭建C/C++開發(fā)環(huán)境
VSCode是由微軟開發(fā)的一款免費、開源、跨平臺的文本編輯器,它具有許多強大的功能,這篇文章主要給大家介紹了關(guān)于如何在VS?Code上搭建C/C++開發(fā)環(huán)境的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2024-03-03