C 模擬實現vector的核心框架介面

2021-10-04 01:23:19 字數 3897 閱讀 5386

vector是表示可變大小陣列的序列容器。

就像陣列一樣,vector也採用的連續儲存空間來儲存元素。也就是意味著可以採用下標對vector的元素進行訪問,和陣列一樣高效。但是又不像陣列,它的大小是可以動態改變的,而且它的大小會被容器自動處理。

本質講,vector使 用動態分配陣列來儲存它的元素。當新元素插入時候,這個陣列需要被重新分配大小為了增加儲存空間。其做法是,分配乙個新的陣列,然後將全部元素移到這個陣列。就時間而言,這是乙個相對代價高的任務,因為每當乙個新的元素加入到容器的時候,vector並不會每次都重新分配大小。

vector分配空間策略: vector會分配一些額外的空間以適應可能的增長 ,因為儲存空間比實際需要的儲存空間更大。不同的庫採用不同的策略權衡空間的使用和重新分配。但是無論如何,重新分配都應該是對數增長的間隔大小,以至於在末尾插入乙個元素的時候是在常數時間的複雜度完成的。

因此,vector占用了更多的儲存空間,為了獲得管理儲存空間的能力,並且以一種有效的方式動態增長。

與其它動態序列容器相比(deques, lists and forward_ lists), vector在訪問元素的時候更加高效, 在末尾新增和刪除元素相對高效。對於其它不在末尾的刪除和插入操作,效率更低。比起lists和 forward_ists統一 的迭代器和引用更好。

#include

#include

#include

#include

using

namespace std;

namespace zd

iterator end()

constiterator cbegin()

const

constiterator cend()

const

size_t size()

size_t capacity()

size_t size()

const

size_t capacity()

const

//建構函式

/*vector()

:_start(nullptr)

, _finish(nullptr)

, _endofstorage(nullptr)

{}*/

vector()

=default

;//拷貝構造

vector

(const vector

& v)

_finish = _start + v.

size()

; _endofstorage = _start + v.

capacity()

;}/*vector& operator=(vectorv)

_finish = _start + v.size();

_endofstorage = _start + v.capacity();

}return *this;

}*/vector

&operator

=(vector v)

void

swap

(vector v)

//析構函式

~vector()

}//reverse()函式用於容器預留空間

void

reserve

(size_t n)

} _start = tmp;

_finish = _start + size;

_endofstorage = _start + n;}}

//改變容器的大小,並建立物件

void

resize

(size_t n,

const t& value =t(

))else

while

(_finish != _start + n)}}

void

pushback

(const t& x)

*_finish = x;

_finish++;*/

insert

(end()

, x);}

void

popback()

void

insert

(iterator pos,

const t& x)

iterator end = _finish;

while

(end > pos)

*pos = x;

_finish++;}

//返回刪除資料的下乙個資料

//方便解決:一邊遍歷一邊刪除的迭代器失效問題

void

erase

(iterator pos)

_finish--;}

t&operator

(size_t pos)

const t&

operator

(size_t pos)

const

private

: iterator _start =

nullptr

;//nullptr是預設值

iterator _finish =

nullptr

; iterator _endofstorage =

nullptr;}

;void

vectortest1()

cout << endl;

v1.resize(3

);vector<

int>

::iterator it1 = v1.

begin()

;while

(it1 != v1.

end())

cout << endl;

v1.popback()

; vector<

int>

::iterator it2 = v1.

begin()

;while

(it2 != v1.

end())

cout << endl;

v1.resize(10

,1);

for(

auto e : v1)

cout << endl;

}void

vectortest2()

for(size_t i =

0; i < v2.

size()

; i++

) cout << endl;

pos = std::

find

(v2.

begin()

, v2.

end(),

3); v2.

erase

(pos)

;for

(size_t i =

0; i < v2.

size()

; i++

) cout << endl;

}void

vectortest3()

cout << endl;

vector<

int> v4;

v4.pushback(1

);v4.

pushback(2

);v4.

pushback(3

);for(size_t i =

0; i < v4.

size()

; i++

) cout << endl;

v4 = v3;

for(size_t i =

0; i < v4.

size()

; i++

) cout << endl;

}void

vectortest4()

cout << endl;}}

intmain()

模擬實現vector

include include using namespace std template class vector 向vector中存入size個元素 vector const t array,size t size start new t size endofstorage start size ...

vector的模擬實現

上一節部落格講述了vector常見介面的使用,今天主要是對vector這些介面進行模擬實現,下面是相關 include include includeusing namespace std namespace ty iterator end citerator cbegin const citera...

vector的模擬實現

最近學習了vector的使用,下面對vctor進行了模擬實現,如有不足請指出 include include include using namespace std template class t class vector 大小 size t size const 容量 size t capaci...