STL原始碼剖析 容器 vector

2022-06-05 20:27:09 字數 1668 閱讀 3366

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...