c++ vector模擬實(shí)現(xiàn)的全過程
一、vector是什么?
vector是表示可變大小數(shù)組的序列容器,它也采用連續(xù)存儲(chǔ)空間來存儲(chǔ)元素,因此可以采用下標(biāo)對(duì)vector的元素進(jìn)行訪問,它的大小是動(dòng)態(tài)改變的,vector使用動(dòng)態(tài)分配數(shù)組來存儲(chǔ)它的元素;
二、容器特性
1.順序序列
順序容器中的元素按照嚴(yán)格的線性順序排序??梢酝ㄟ^元素在序列中的位置訪問對(duì)應(yīng)的元素;
2.動(dòng)態(tài)數(shù)組
支持對(duì)序列中的任意元素進(jìn)行快速直接訪問,甚至可以通過指針進(jìn)行該操作。操供了在序列末尾相對(duì)快速地添加/刪除元素的操作;
3.能夠感知內(nèi)存分配器的
容器使用一個(gè)內(nèi)存分配器對(duì)象來動(dòng)態(tài)地處理它的存儲(chǔ)需求;
三、vector的模擬實(shí)現(xiàn)
定義一個(gè)類:
template<class T>
class Vector
{
T* _start; //首元素地址
T* _finish; //最后一個(gè)元素地址的下一個(gè)地址
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;
}
擴(kuò)容
有資源進(jìn)行拷貝時(shí),使用深拷貝;類型為自定義類型時(shí),發(fā)生淺拷貝,調(diào)用自定義類型析構(gòu)函數(shù),釋放資源,導(dǎo)致資源二次釋放,所以自定義類型的拷貝有資源時(shí)進(jìn)行深拷貝;
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;
}
//移動(dòng)元素
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)
{
//移動(dòng)元素
iterator start = pos + 1;
while (start!=_finish)
{
*(start - 1) = *start;
start++;
}
//更新
--_finish;
}
return pos;
}
//返回刪除數(shù)據(jù)的下一個(gè)元素的位置
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模擬實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)c++ vector模擬實(shí)現(xiàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)踐Time類中的運(yùn)算符重載參考方法
今天小編就為大家分享一篇關(guān)于C++實(shí)踐Time類中的運(yùn)算符重載參考方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02
C++算法設(shè)計(jì)之馬踏棋盤的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了C++算法設(shè)計(jì)之馬踏棋盤的實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
Qt中const?QString轉(zhuǎn)換?char?*可能的坑
本文主要介紹了Qt中const?QString轉(zhuǎn)換?char?*可能的坑,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
C語言實(shí)現(xiàn)基于控制臺(tái)的電子時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)基于控制臺(tái)的電子時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
淺談C++高并發(fā)場(chǎng)景下讀多寫少的優(yōu)化方案
本文主要介紹了淺談C++高并發(fā)場(chǎng)景下讀多寫少的優(yōu)化方案,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
C++如何在一個(gè)函數(shù)內(nèi)返回不同類型(三種方法)
C++?中要在一個(gè)函數(shù)內(nèi)返回不同類型的值,你可以使用?C++17?引入的?std::variant?或?std::any,或者使用模板和多態(tài),下面將分別介紹這些方法,需要的朋友可以參考下2023-12-12
C++將音頻PCM數(shù)據(jù)封裝成wav文件的方法
這篇文章主要為大家詳細(xì)介紹了C++將音頻PCM數(shù)據(jù)封裝成wav文件的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
Win10下最新版CLion(2020.1.3)安裝及環(huán)境配置教程詳解
這篇文章主要介紹了Win10下最新版CLion(2020.1.3)安裝及環(huán)境配置,CLion 是 JetBrains 推出的全新的 C/C++ 跨平臺(tái)集成開發(fā)環(huán)境,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2020-08-08
一文詳解如何在VS?Code上搭建C/C++開發(fā)環(huán)境
VSCode是由微軟開發(fā)的一款免費(fèi)、開源、跨平臺(tái)的文本編輯器,它具有許多強(qiáng)大的功能,這篇文章主要給大家介紹了關(guān)于如何在VS?Code上搭建C/C++開發(fā)環(huán)境的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03

