順序容器vector

2021-09-14 03:41:03 字數 3697 閱讀 2288

vector的關鍵在於其對大小的控制以及重新配置時的資料搬移效率

由於vector維護的是乙個連續線性空間,所以不論元素類別,普通指標都可以作為vector的迭代器而滿足必要條件,包括隨機訪問、操作符(*、->、++,–,+,-,+=,-=)等操作行為。

vector提供的是random access iterators。

typedef value_type* iterator;

//value_type是元素型別

線性連續空間,以兩個迭代器startfinish分別指向配置得來的連續空間中目前已使用的範圍,並以迭代器end_of_storage指向整塊連續空間(含備用空間)的尾端。

為了降低空間配置時的速度成本, vector實際配置的大小可能比客戶端需求量更大一些,以備將來可能的擴充。

根據vs2017的環境(c++17),若需要空間大於當前capacity的1.5倍,則擴充為需要空間大小,反之擴充為capacity的1.5倍。以下為capacity增長**:

size_type _calculate_growth

(const size_type _newsize)

const

const size_type _geometric = _oldcapacity + _oldcapacity /2;

if(_geometric < _newsize)

return

(_geometric)

;// geometric growth is sufficient

}

(以下內容參考c++17原始碼)

push_back呼叫emplace_back

template

<

class..

. _valty>

decltype

(auto

)emplace_back

(_valty&&..

. _val)

else

const size_type _newsize = _oldsize +1;

const size_type _newcapacity =

_calculate_growth

(_newsize)

;//需要擴充的容量

bool _emplaced =

false

;const pointer _newvec =

this

->

_getal()

.allocate

(_newcapacity)

;//分配需要容量的記憶體

_alty& _al =

this

->

_getal()

;//在新記憶體空間中構造變數

_try_begin

_alty_traits::

construct

(_al,

_unfancy

(_newvec + _oldsize)

, _std forward<_valty>

(_val)..

.); _emplaced =

true

;_umove_if_noexcept

(this

->

_myfirst()

,this

->

_mylast()

, _newvec)

; _catch_all

if(_emplaced)

//銷毀舊的記憶體空間,如果沒有覆蓋成功,則把新記憶體空間銷毀

_al.

deallocate

(_newvec, _newcapacity)

; _reraise;

_catch_end

_change_array

(_newvec, _newsize, _newcapacity);}

#if _has_cxx17

return

(this

->

_mylast()

[-1]

);#endif

/* _has_cxx17 */

}

insert(插入乙個元素)呼叫emplace函式

(以下內容參考stl原始碼剖析,和最新版vector(c++17)有所出入)

//alloc 是sgi stl的空間配置器

template

<

classt,

class

alloc

= alloc>

class

vector

void

fill_initialize

(size_type n,

const t& value)

public

: iterator begin()

iterator end()

size_type size()

const

size_type capacity (

)const

bool

empty()

const

reference operator

(size_type n)

vector()

:start(0

),finish(0

), end_of_storage (0)

vector

( size_type n,

const t& value)

vector

(int n,

const t& value )

vector

(long n,

const t& value)

explicit

vector

( size_type n)

//explicit 阻止隱式轉換,通過t型別的預設初始化函式進行初始化

~vector()

reference front()

//第乙個元素

reference back()

// 最後乙個元素

void

push_back

(const t& x)

else

insert_aux

(end()

, x );}

void

pop_back()

iterator erase ( iterator position )

void

resize

(size_type new_size,

const t& x)

void

resize

(size_type new_size)

void

clear()

protected

: iterator allocate_and_fill

( size_type n,

const t& x )

}

順序容器 vector

一 底層實現 vector就是動態陣列.它也是在堆中分配記憶體,元素連續存放,有保留記憶體,如果減少大小後,記憶體也不會釋放.如果新值 當前大小時才會再分配記憶體.它擁有一段連續的記憶體空間,並且起始位址不變,因此它能非常好的支援隨即訪問,即操作符,但由於它的記憶體空間是連續的,所以在中間進行插入和...

順序容器 vector

vector與array非常相似,唯一的區別在於靈活性,陣列是靜態空間,一旦定義就不能改變,變大變小都需要客戶端自己重新配置新的空間,然後將元素從舊址搬到新址,再把原來的空間還給系統。vector是動態空間,隨著元素的加入,他的內部機制會自行擴充空間以容納新元素。1.vector的底層實現 vect...

STL順序容器 vector

vector是乙個線性順序結構。相當於陣列,但其大小可以不預先指定,並且自動擴 展。它可以像陣列一樣被操作,由於它的特性我們完全可以將vector 看作動態數 組。在建立乙個vector 後,它會自動在記憶體中分配一塊連續的記憶體空間進行資料 儲存,初始的空間大小可以預先指定也可以由vector 預...