【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
【STL】vector的模擬實現
#include #include using namespace std; template class Vector { public: typedef T* Iterator; typedef const T* ConstIterator; Vector() //空引數的建構函式
【STL】vector的五種建構函式
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 ),那種資料被插入,然後再容器末端取出 棧實現了容器介面卡,這是用了一個封裝了的類作為他的特定容器,提供了一組成員函式去訪問他的元素,元素從特定的容器,也就是堆疊的頭取出袁術。 這
【STL】之Vector詳解
Vector概述 C++內建了陣列的型別,在使用陣列的時候,必須指定陣列的長度,一旦配置了就不能改變了,通常我們的做法是:儘量配置一個大的空間,以免不夠用,這樣做的缺點是比較浪費空間,預估空間不當會引起很多不便。 STL實現了一個Vector容器,該容
1063 Set Similarity (25 分)【STL中vector與set的使用】
1063 Set Similarity (25 分) Given two sets of integers, the similarity of the sets is defined to be Nc/Nt×100%, where Nc
【STL】list的簡單剖析以及各種函式的實現
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>按鈕
【JavaScript】JavaScript(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 題解:從大到小排序邊權後依次枚舉,若兩端點特殊則斷邊,若一端點特殊則合並傳遞,若無端點特殊則合並
【BBED】BBED模擬並修復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 導讀和註意事項 各位技術愛
【Foreign】Bumb [模擬退火]
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. 鼠標放置到輪播圖上,顯示兩側的