1. 程式人生 > >【STL】vector的模擬實現

【STL】vector的模擬實現

#include 
#include 
using namespace std;

template
class Vector
{
public:
	typedef  T* Iterator;
	typedef const T* ConstIterator;

	Vector()  //空引數的建構函式
		:_start(NULL), _finish(NULL), _EndofStore(NULL)
	{}
	Vector(size_t n, T val)   //引數為n個value的構造
		:_start(new T[n]), _finish(_start), _EndofStore(_start+n)   
	{
		size_t i = 0;
		for (i = 0; i < n;i++)
		{
			_start[i] = val;
		}
		_finish = _start + n;    
	}

	Vector(const Vector & v)   //引數為Vector的拷貝構造
		:_start(NULL), _finish(NULL), _EndofStore(NULL)
	{
		size_t size = v.Size();
		if (size > 0)
		{
			Expand(size);
			for (size_t i = 0; i < size; i++)
			{
				_start[i] = v._start[i];
			}
			_finish = _start + size;	
		}
	}
	Vector(ConstIterator first, ConstIterator last)     //引數為迭代器區間的構造
		:_start(NULL), _finish(NULL), _EndofStore(NULL)
	{
		size_t size = first - last;
		if (size > 0)
		{
			Expand(size);
			for (size_t i = 0; i < size; i++)
			{
				_start[i] = first[i];
			}
			_finish = _start + size;
		}
	}

	~Vector()   //解構函式
	{
		Destroy();
	}

	bool Checkfull()
	{
		return _EndofStore >= _finish;
	}
	void Expand(size_t n)   //增容函式
	{
		assert(n > Capacity());
		T* tmp = new T[n];
		size_t size = Size();
		for (size_t i = 0; i < size; i++)    //擴容後拷貝原來資料
		{
			tmp[i] = _start[i];
		}

		delete[] _start;
		_start = tmp;
		_finish = _start + size;
		_EndofStore = _start + n;

	}
	void Destroy()       //銷燬Vector的函式
	{
		if (_start != NULL)
		{
			delete[] _start;
		}
		_start = _finish = _EndofStore = NULL;
	}

	size_t Size()const
	{
		return _finish - _start;
	}
	size_t Capacity()const
	{
		return _EndofStore - _start;
	}

	//迭代器的生成器
	Iterator Begin()
	{
		return _start;
	}
	Iterator End()
	{
		return _finish;
	}

	void CheckCapacity()
	{
		if (_finish == _EndofStore)
		{
			size_t newcapacity = Capacity() + 3;
			Expand(newcapacity);
		}
	}
	
	void Insert(Iterator pos, const T& x)  //隨機位置的插入函式,尾插頭插都靠他
	{
		size_t newpos = pos - _start;          
		//因為要調整空間,舊的pos在調整空間以後會失效,先記錄與_start的偏移量;在調整後的新空間能找到對應的新pos
		CheckCapacity();
		pos = _start + newpos;
		for (Iterator tmp = End(); tmp > pos; tmp--)
		{
			*tmp = *(tmp - 1);
		}
		*pos = x;
		_finish++;
	}

	void Erase(Iterator &pos)  //任意位置的刪除函式,尾刪頭刪都靠他
	{
		Iterator end = End();
		for  (; pos < (--end); pos++)
		{
			*pos = *(pos + 1);
		}
		_finish--;
	}

	void Pushback(const T& val)   //尾插
	{
		
		Insert(End(), val);
	}
	void Popback()   //尾刪
	{
		if (Size() != 0)
		{
			Iterator end= End();
			Erase( --end );
		}
	}
	void Pushfront(const T& val) //頭插
	{
		
		Insert(Begin() , val);
	}
	void Popfront()  //頭刪
	{
		if (Size() != 0)
		{
			Iterator start= Begin();
			Erase(start);
		}
	}

protected:
	Iterator _start;
	Iterator _finish;
	Iterator _EndofStore;
};

相關推薦

STL vector 模擬實現

    上一篇部落格說了一下list的使用,其實vector用法基本上和list是一樣的,所以此篇部落格就只模擬實現以下vector。vector你可以把它理解成一個順序表或者陣列。只是STL裡的vector是由三個迭代器來維護的:_start(資料存放開始的位置),_fi

STLvector模擬實現

#include #include using namespace std; template class Vector { public: typedef T* Iterator; typedef const T* ConstIterator; Vector() //空引數的建構函式

STLvector的五種建構函式

vector的五種建構函式, 例子摘自MSDNvoid test_vector_constructor() { // 0. Create an empty vector v0 std::vector<int> v0; assert(v0.empty());

vector中的刪除,erase和remove的小疑惑--STL

對於vector容器的使用,平時只是簡單的進行遍歷查詢一下,未曾進行其它操作,這不,今天出了一點差錯; erase方法的操作是將此時的節點刪除,然後指向被刪除節點的下一個: 如對資料1 6 6 4 7; #include <iostream> #include

使用Vector模擬實現STL中的stack

stack 介紹 棧是一種容器介面卡,特別為後入先出而設計的一種(LIFO ),那種資料被插入,然後再容器末端取出 棧實現了容器介面卡,這是用了一個封裝了的類作為他的特定容器,提供了一組成員函式去訪問他的元素,元素從特定的容器,也就是堆疊的頭取出袁術。 這

STLVector詳解

Vector概述 C++內建了陣列的型別,在使用陣列的時候,必須指定陣列的長度,一旦配置了就不能改變了,通常我們的做法是:儘量配置一個大的空間,以免不夠用,這樣做的缺點是比較浪費空間,預估空間不當會引起很多不便。 STL實現了一個Vector容器,該容

1063 Set Similarity (25 分)STLvector與set的使用

1063 Set Similarity (25 分) Given two sets of integers, the similarity of the sets is defined to be N​c​​/N​t​​×100%, where N​c​​

STLlist的簡單剖析以及各種函式的實現

STL中的list是比較常用的容器,對於任何位置的元素插入或元素移除,list永遠是常數。 list中的迭代器在插入和刪除後,仍然有效,但是耦合操作splice操作可能使迭代器失效,而vector就不成立了。 list節點 template <

UVA 11991 Easy Problem from Rujia Liu?STL

dex space queue rom () ont cti process 代碼 題目鏈接: option=com_onlinejudge&Itemid=8&page=show_problem&problem=3142">ht

前端用jQuery實現瀑布流效果

scrollto title n) 個性 避免 ive gets type turn jQuery實現瀑布流效果 何為瀑布流:   瀑布流,又稱瀑布流式布局。是比較流行的一種網站頁面布局,視覺表現為參差不齊的多欄布局,隨著頁面滾動條向下滾動,這種布局還會不斷加載數據塊並附加

Jmeter模擬發送TCP/UDP/HTTP/FTP等請求包

lose property lib 格式 自定義 ras esp tle .cn JMeter安裝UDP插件後支持發送UDP協議的請求包,官方介紹安裝插件後可以用來測試DNS, NTP, TFTP, Boot servers and many-many other syst

jQuery利用jQuery實現“記住我”的功能

jquer sms sep jquery實現 .com script lis put bar 【1】先下載jQuery.cookie插件:使用幫助請參考鏈接(https://github.com/carhartl/jquery-cookie)。 【2】安裝插件:

前端vue.js實現按鈕的動態綁定

case ctype html 們的 ast pre cal 防止 得到 vue.js實現按鈕的動態綁定 實現效果: 實現代碼以及註釋: <!DOCTYPE html> <html> <head> <title>按鈕

JavaScriptJavaScript(V8)實現輸入輸出

https func split 舉例 tps blog turn 輸出 ret 首先看牛客網的樣例:https://www.nowcoder.com/questionTerminal/dae9959d6df7466d9a1f6d70d6a11417 計算a+b的和,每行包

養生NOIP模擬

分開 最小 合並 排序 -1 nbsp 判斷 傳遞 9.4 第一場:9.4 T1:n個點的樹,k個特殊點要求斷k-1條邊使它們分開,求最小代價。 算法:排序+並查集||樹型DP 題解:從大到小排序邊權後依次枚舉,若兩端點特殊則斷邊,若一端點特殊則合並傳遞,若無端點特殊則合並

BBEDBBED模擬並修復ORA-08102錯誤

ora-08102 .cn 愛好者 愛好 技術 1.2 log blog 不知道 【BBED】BBED模擬並修復ORA-08102錯誤 【BBED】BBED模擬並修復ORA-08102錯誤 1.1 BLOG文檔結構圖 1.2 前言部分 1.2.1 導讀和註意事項 各位技術愛

ForeignBumb [模擬退火]

ear cloc hid 變化 == tchar 個數 main ron Bumb Time Limit: 20 Sec Memory Limit: 512 MB Description    Input    Output    Sample Inp

管用 使用VMtools實現主機Windows與虛擬機Linux文件共享

工具 http 環境 functions user sha use 提示 文件服務 實現windows主機與linux虛擬機文件共享,有很多方法,包括使用samba文件服務器等,本文介紹通過vmware虛擬機軟件中的vmtools工具來實現文件共享。 一、環境 1、主機

前端特效-Javascript實現購物頁面圖片放大效果

position pre children mes ges 冒泡 cnblogs absolute 取值 實現效果 實現代碼: <!DOCTYPE html> <html> <head> <title>購物圖片放大&

前端javascript+jQuery實現旋轉木馬效果輪播圖slider

pad 語句 borde nbsp strong 調用 define ide right 實現效果: 實現原理: 技術棧: javascript+jQuery+html+css 實現步驟: // 0. 獲取元素 // 1. 鼠標放置到輪播圖上,顯示兩側的