STL原始碼閱讀 二

2021-07-15 23:21:38 字數 2296 閱讀 4079

// vector的記憶體分配基類

template

class _vector_alloc_base ;

// _vector_alloc_base的偏特化版本,不需要儲存記憶體分配器

template

class _vector_alloc_base<_tp, _allocator, true>

template

struct _vector_base

: public _vector_alloc_base<_tp, _alloc, _alloc_traits<_tp, _alloc>::_s_instanceless>

_vector_base(size_t __n, const allocator_type& __a) : _base(__a)

~_vector_base()

}template

class

vector : protected _vector_base<_tp, _alloc>;

vector維護的是一段連續記憶體區域[_m_start, _m_end_of_storage),已經使用的記憶體區域

是[_m_start, _m_finish)。

vector中的迭代器時直接指向記憶體元素的指標。

成員函式at訪問指定元素時會進行邊界檢查,當發生越界訪問時,會丟擲_stl_throw_range_error("vector")。

operator不會進行邊界檢查。

預設建構函式是不會初始化記憶體的,其它建構函式會呼叫uninitialized_fill_n, uninitialized_copy初始化

記憶體。注意,reserve重新分配記憶體空間大小new_size時,當new_size > capacity()時,會先分配new_size記憶體,然後

拷貝以前的元素到新記憶體中,釋放就記憶體區域,更新_m_start, _m_finish, _m_end_of_storage。

new_size < capacity()不會進行任何操作。

注意,pop_back移除vector最後乙個元素,但是並沒有返回該元素的值(不知道為什麼要這樣設計)。

注意,erase移除元素時,會將所移除元素或區域的後續元素拷貝到前面填充被移除元素的空閒區域。

注意,sgi vector swap實現交換兩個vector物件的內容時,不是拷貝元素交換,而是交換兩個vector的指標。所以,

之前使用它們的迭代器都已經無效了,需要重新更新。和c++11參考手冊上關於vector swap的語義不一樣哈,參考手冊上

寫的是迭代器與應用都依舊是有效的。所以實際使用的時候,還是先測試一下或看一下實現原始碼比較好。

void swap(vector

<_tp, _alloc>& __x)

注意,assign的語義是替換,即替換之前的內容替換為現在的內容,它的兩個實現版本,如下:

void assign(size_type __n, const _tp& __val)

else

if (__n > size())

else

erase(fill_n(begin(), __n, __val), end());

}template

template

void

vector

<_tp, _alloc>::_m_assign_aux(_inputiter __first, _inputiter __last,

input_iterator_tag)

template

template

void

vector

<_tp, _alloc>::_m_assign_aux(_forwarditer __first, _forwarditer __last,

forward_iterator_tag)

else

if (size() >= __len)

else

}其它的insert, operator=, erase,resize操作都會拷貝移動元素。另外,注意resize與reserve的區別,

當new_size < size()會呼叫erase移除多餘的元素;否則,會呼叫insert以初始值初始化插入元素。

另外insert,push_back新增新元素,記憶體不足時,會以原來記憶體大小的二倍重新分配記憶體,並將原來的元素拷貝

到新記憶體中。

另外,像一些函式如__m_fill_assign不應該暴露給使用者的,卻沒有隱藏起來,不知道為什麼。

sgi stl

cppreference.com

STL 原始碼閱讀

1 這裡可以看出來,容器將迭代器作為類成員。vectora iteratorite a.begin 容器的成員函式可以返回迭代器,所以迭代器是容器的成員物件。2 個人理解,迭代器是對指標的封裝和提公升,盡可能遮蔽資料結構的底層細節,對外提供統一的操作介面,這些介面跟普通指標的功能類似,比如自增或自減...

STL原始碼閱讀 七

set使用紅黑樹實現,每個鍵值都不相同,且按序儲存。注意operator 即 rb tree的實現 先銷毀賦值號左邊的set,然後將右邊的set拷貝給左邊的set,而不是原值替換。set的所有函式都是用 rb tree的函式實現的,相當於 rb tree的乙個包裝類。multiset使用紅黑樹實現,...

STL原始碼閱讀 八

字串的雜湊函式 f s 5 f s 1 s,當len s 1,則f s s 其中s是指向字串的指標。示例 inline size t stl hash string const char s template struct hash sgi hash table碰撞檢測方法是鏈結法,雜湊表的每個槽都...