C 小工修煉手冊 (vector實現)

2021-09-29 03:23:26 字數 3799 閱讀 6980

t():

如果t代表的是內建型別, t()代表的是 0

如果t代表的是自定義型別,那麼t()代表的就是呼叫這種型別的無參建構函式

erase()函式用迭代器引數,刪除元素之後又會返回乙個迭代器,按道理來說迭代器不應該失效的,但是stl讓迭代器失效了,這樣做的目的就是,假如你刪的是最後乙個元素,尾位置只需要前移,這樣的話,迭代器就失效了。

一般我們看stl的原始碼看的都是sgi版本的因為,sgi版本的**可讀性更高,而pj版本的可讀性太低了

vecto有乙個缺點就是在任意位置的插入刪除效率比較低

#include

#include

using

namespace std;

namespace n1

vector

(int n,

const t& data)

:_begin

(new t[n]

) _end = _begin + n;

_endofstorage = _end;

}template

<

class

iterator

>

//任意型別區間

vector

(iterator first, iterator end)

_begin =

new t[length]

;for

(int i =

0; i < length;

++i)

_end = _begin + length;

_endofstorage = _end;

}vector

(vector

& data)

_end = _begin + si;

_endofstorage = _end;

} vector

&operator

=(vector

& data)

//賦值運算子裡面我給出了兩步操作

int si = data.

size()

; _begin =

new t[si]

;for

(int i =

0; i < si;

++i)

_end = _begin + si;

_endofstorage = _end;

return

*this;}

~vector()

} iterator begin()

iterator end()

void

resize

(int newsize,

const t& data =t(

))} _end = _begin + newsize;

}void

reserve

(int newcapacity)

delete

_begin;

} _begin = temp;

//_end = _begin + size(); 這樣寫有坑,必須要在之前的位置將size()儲存起來,因為擴容結束,_begin只向新空間,_end依然在舊空間,相減無意義,但是+在_end上無意義,執行會出錯

_end = _begin + n;

_endofstorage = _begin + newcapacity;}}

const t&

operator

(int n)

const

t&operator

(int n)

t&front()

const t&

front()

const

t&back()

const t&

back()

const

void

push_back

(const t& data)

void

pop_back()

iterator insert

(iterator pos,

const t& data)

//返回值意思是剛插入元素的位置

*pos = date;

_end++

;//標記尾部的標記後移

return pos;

} iterator erase

(iterator pos)

--_end;

標記尾部的標記前移

return pos;

}int

size()

intcapacity()

bool

empty()

void

clear()

private

: t* _begin;

//標記起始位置

t* _end;

//標記有效元素末尾

t* _endofstorage;

//標記空間末尾

void

check()

}};void

test()

; vector<

int>

v3(a, a +

(sizeof

(a)/

sizeof

(a[0])

)); vector<

int>

v4(v3)

; vector<

int> v5;

v5 = v4;

cout << v1.

size()

<< endl;

cout << v1.

capacity()

<< endl;

cout << v2.

size()

<< endl;

cout << v2.

capacity()

<< endl;

cout << v3.

size()

<< endl;

cout << v3.

capacity()

<< endl;

cout << v4.

size()

<< endl;

cout << v4.

capacity()

<< endl;

cout << v5.

size()

<< endl;

cout << v5.

capacity()

<< endl;

auto it = v3.

begin()

;while

(it != v3.

end())

cout << endl;

cout << v3.

front()

<< endl;

cout << v3.

back()

<< endl;

}void

test1()

cout << endl;

v1.pop_back()

; v1.

pop_back()

; v1.

pop_back()

;auto it2 = v1.

begin()

;while

(it2 != v1.

end())

cout << endl;}}

using

namespace n1;

intmain()

C 小工修煉手冊 (模板 STL簡介)

導致記憶體洩露的常見場景有哪些 1.在申請空間之後忘記釋放空間,這樣的話就會導致記憶體洩露 2.一些誤操作,比如淺拷貝問題,兩個指標指向一塊空間,但是其中乙個指標的空間未被釋放 3.異常安全問題,在空間未釋放之前就被異常捕獲,而去執行其他 沒有釋放空間 記憶體洩漏的危害 長期執行的程式 出現記憶體洩...

使用C 實現Vector

最近開始學習資料結構與演算法了,使用的是weiss的資料結構與演算法c 描述,第三版和第四版。其中第四版已經全部用c 11的標準重寫了。感覺我自己寫的時候有點糾結到底用c 老的標準還是c 11的標準,哈哈,選擇困難!今天我主要用c 老的標準寫了vector類,因此沒有實現移動建構函式和移動拷貝函式。...

C 模式實現vector

include include include using namespace std namespace my vector 2.c 11構造 以列表初始化 比如乙個array,乙個list vector initializer list il start nullptr finish nullp...