天天看點

vector之三(模拟實作vector)1 vector 介紹2 vector接口模拟實作

文章目錄

  • 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源碼剖析》中有:

vector之三(模拟實作vector)1 vector 介紹2 vector接口模拟實作

上圖介紹了簡單的vector結構。

2 vector接口模拟實作

2.1 疊代器實作

vector之三(模拟實作vector)1 vector 介紹2 vector接口模拟實作

2.2 capacity、size、empty

vector之三(模拟實作vector)1 vector 介紹2 vector接口模拟實作
vector之三(模拟實作vector)1 vector 介紹2 vector接口模拟實作

2.3 operator[]

vector之三(模拟實作vector)1 vector 介紹2 vector接口模拟實作

2.4 resize

vector之三(模拟實作vector)1 vector 介紹2 vector接口模拟實作

2.5 reserve

vector之三(模拟實作vector)1 vector 介紹2 vector接口模拟實作

2.6 push_back & pop_back

vector之三(模拟實作vector)1 vector 介紹2 vector接口模拟實作

2.7 insert

vector之三(模拟實作vector)1 vector 介紹2 vector接口模拟實作
vector之三(模拟實作vector)1 vector 介紹2 vector接口模拟實作

2.8 erase

vector之三(模拟實作vector)1 vector 介紹2 vector接口模拟實作

2.9 拷貝構造&指派拷貝&析構

vector之三(模拟實作vector)1 vector 介紹2 vector接口模拟實作
// 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源碼剖析》

繼續閱讀