文章目錄
- 1 vector 介紹
- 2 vector接口模拟實作
-
- 2.1 疊代器實作
- 2.2 capacity、size、empty
- 2.3 operator[]
- 2.4 resize
- 2.5 reserve
- 2.6 push_back & pop_back
- 2.7 insert
- 2.8 erase
- 2.9 拷貝構造&指派拷貝&析構
- 代碼
1 vector 介紹
vector的資料安排以及操作方式與數組非常相似。兩者唯一差別在于空間的運用的靈活性。數組是靜态空間,一旦配置好了就不能改變,但是vector是動态空間,随着元素的加入,它的内部機制會自行擴充空間以容納新元素。下文分析SGI版本的vector的簡單實作。
侯捷老師的《STL源碼剖析》中有:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL1UkaNNTVE90MNpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLzAjYlBDMwIDZxYTZ2MmNiRzM0QjNkFTY5MDO3MGNzQ2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
上圖介紹了簡單的vector結構。
2 vector接口模拟實作
2.1 疊代器實作
2.2 capacity、size、empty
2.3 operator[]
2.4 resize
2.5 reserve
2.6 push_back & pop_back
2.7 insert
2.8 erase
2.9 拷貝構造&指派拷貝&析構
// v2(v1) 拷貝構造函數
vector(const vector<T>& v)
: _start(nullptr)
, _finish(nullptr)
, _endofstorage(nullptr)
{
/*reserve(v.capacity());
for (auto e : v)
{
push_back(e);
}*/
_start = new T[v.capacity()];
//memcpy(_start, v._start, sizeof(T)*v.size()); //适合内置類型
for (size_t i = 0; i < v.size(); ++i) //适合自定義類型
{
_start[i] = v._start[i];
}
_finish = _start + v.size();
_endofstorage = _start + v.capacity();
}
// v1 = v3 指派拷貝
vector<T>& operator=(vector<T> v)
{
swap(v);
return *this;
}
//析構
~vector()
{
if (_start)
{
delete[] _start;
}
_start = _finish = _endofstorage = nullptr;
}
// v1.swap(v2)
void swap(vector<T>& v)
{
::swap(_start, v._start);
::swap(_finish, v._finish);
::swap(_endofstorage, v._endofstorage);
}
代碼
vector實作代碼連結點此處。
參考:本文的圖檔引用了http://www.cplusplus.com/ 和 侯捷老師的 《STL源碼剖析》