vector的關鍵在於其對大小的控制以及重新配置時的資料搬移效率。
由於vector維護的是乙個連續線性空間,所以不論元素類別,普通指標都可以作為vector的迭代器而滿足必要條件,包括隨機訪問、操作符(*、->、++,–,+,-,+=,-=)等操作行為。
vector提供的是random access iterators。
typedef value_type* iterator;
//value_type是元素型別
線性連續空間,以兩個迭代器start
和finish
分別指向配置得來的連續空間中目前已使用的範圍,並以迭代器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 預...