c++ vector模擬實(shí)現(xiàn)的全過程
一、vector是什么?
vector是表示可變大小數(shù)組的序列容器,它也采用連續(xù)存儲空間來存儲元素,因此可以采用下標(biāo)對vector的元素進(jìn)行訪問,它的大小是動態(tài)改變的,vector使用動態(tài)分配數(shù)組來存儲它的元素;
二、容器特性
1.順序序列
順序容器中的元素按照嚴(yán)格的線性順序排序??梢酝ㄟ^元素在序列中的位置訪問對應(yīng)的元素;
2.動態(tài)數(shù)組
支持對序列中的任意元素進(jìn)行快速直接訪問,甚至可以通過指針進(jìn)行該操作。操供了在序列末尾相對快速地添加/刪除元素的操作;
3.能夠感知內(nèi)存分配器的
容器使用一個內(nèi)存分配器對象來動態(tài)地處理它的存儲需求;
三、vector的模擬實(shí)現(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;
}
擴(kuò)容
有資源進(jìn)行拷貝時,使用深拷貝;類型為自定義類型時,發(fā)生淺拷貝,調(diào)用自定義類型析構(gòu)函數(shù),釋放資源,導(dǎo)致資源二次釋放,所以自定義類型的拷貝有資源時進(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;
}
//移動元素
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模擬實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)c++ vector模擬實(shí)現(xiàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Visual studio setup.exe 安裝vs2022報錯的解決方案
這篇文章主要介紹了Visual studio setup.exe 安裝vs2022報錯的解決方案,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01
QT線程池的使用(QThreadPool類和QRunnable類)
本文主要介紹了QT線程池的使用(QThreadPool類和QRunnable類),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
C語言詳細(xì)解析有符號數(shù)與無符號數(shù)的表示
我們知道,在C語言中存在無符號數(shù)和有符號數(shù),但是對于計(jì)算機(jī)而言,其本身并不區(qū)別有符號數(shù)和無符號數(shù),因?yàn)樵谟?jì)算機(jī)里面都是O或者1,但是在我們的實(shí)際使用中有時候需要使用有符號數(shù)來表示一個整數(shù),因此我們規(guī)定,當(dāng)最高位為1的時,表示為負(fù)數(shù),最高位為0時,表示為正數(shù)2022-04-04
C語言實(shí)現(xiàn)求解最小公倍數(shù)的算法示例
這篇文章主要為大家介紹了C語言如何實(shí)現(xiàn)求解任意兩個正整數(shù)的最小公倍數(shù),文中采用了窮舉法和定理法。感興趣的小伙伴快來跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12

