vector 常被稱為向量容器,因為該容器擅長在尾部插入或刪除元素,在常量時間內就可以完成,時間複雜度為o(1)
;而對於在容器頭部或者中部插入或刪除元素,則花費時間要長一些(移動元素需要耗費時間),時間複雜度為線性階o(n)
。
vector實現的關鍵在於其對大小的控制以及重新配置時的資料移動效率。
vector 維護的是乙個連續線性空間,所以不論其元素型別為何,普通指標都可以作為 vector 的迭代器而滿足所有必要條件。
增加新元素時,如果超過當時的容量,則容量會擴大至兩倍。
過程分析:
配置一塊更大空間(2倍,初始為0則配置新的空間大小為1)原始碼參考:拷貝原資料並插入新元素
1)拷貝插入位置前的資料
2)在插入位置插入新元素
3)拷貝插入位置後的資料
釋放原空間
更新迭代器!!!
template void
vector<_tp _alloc>::_m_insert_aux(iterator __position, const _tp& __x)
else
/* 釋放原空間 */
__stl_unwind((destroy(__new_start,__new_finish),
_m_deallocate(__new_start,__len)));
destroy(begin(), end());
_m_deallocate(_m_start, _m_end_of_storage - _m_start);
/* 更新迭代器 */
_m_start = __new_start;
_m_finish = __new_finish;
_m_end_of_storage = __new_start + __len;
}}
push_back()
:插入操作(末尾)
pop_back()
:刪除操作(末尾)
erase()
:清除某範圍[first, last)
元素,或刪除某個位置上的元素
insert()
:從某個位置,插入 n 個元素,元素初值為x
clear()
:清除所有元素
begin()
:返回第乙個元素的迭代器
注意:reserve(size_type __n)
:配置vector容量為__n
,如果 vector 的容量已經大於或等於__n
個元素,那麼什麼也不做;呼叫 reserve() 不會影響已儲存的元素,也不會生成任何元素。
vector<_tp _alloc>& operator=(const vector<_tp _alloc>& __x);
void reserve(size_type __n)
}
STL原始碼剖析 容器 RB tree
rb tree,全稱是red black tree,又稱為 紅黑樹 紅黑樹本質上是一種二叉查詢樹,但它在二叉查詢樹的基礎上額外新增了乙個標記 顏色 同時具有一定的規則。這些規則使紅黑樹保證了一種平衡,插入 刪除 查詢的最壞時間複雜度都為o logn 每個節點不是紅色就是黑色 根結點永遠都是黑色 所有...
STL原始碼剖析 關聯式容器
一 set 所有元素都會根據元素的鍵值自動排序,set元素不像map那樣可以同時擁有key和value,set元素的鍵值就是實值,set不允許有兩個相同元素的鍵值。二 map 所有元素都會根據元素的鍵值自動排序,map不允許有兩個元素有相同的鍵值。以紅黑樹作為底層機制,每乙個節點上的內容是乙個pai...
《STL原始碼剖析》 序列式容器
stl原始碼剖析 前言 所謂的序列式容器,其中的元素都可序,但未必有序,c 本身提供了乙個序列式容器array,stl 提供了vector,list,deque,srack,queue,priority queue等 一.使用reverse 函式提前設定容量大小 1.1 提前設定的原因 對於vect...