STL原始碼閱讀 四

2022-08-29 09:30:13 字數 1928 閱讀 6533

// deque的記憶體管理,分配一段記憶體_m_map用來儲存指向快取區域的指標,每當快取區域buffer不足時,分配一段新的快取區域,然後

// 將指向該區域的指標新增到_m_map中。buffer大小的分配原則是,當sizeof(_tp) > 512時,分配的快取大小sizeof(_tp);否則,

// 分配的快取大小為sizeof(_tp) * (512 / sizeof(_tp));

template class _deque_alloc_base; // 每個類中保留兩個分配器物件,_m_map_allocator, _m_node_allocator

template class _deque_alloc_base<_tp, _alloc, true>; // 使用靜態記憶體分配器

// deque迭代器,迭代器型別隨機迭代器random_access_iterator_tag。

template struct _deque_iterator

// 注意迭代器迭代元素的方式,迭代器所處理的記憶體空間從整體上看不是連續的,但從區域性看是連續的

// 計算迭代器的差值

difference_type operator-(const _self& __x) const

_self& operator+=(difference_type __n)

return *this;

}// deque基類

template class _deque_base

: public _deque_alloc_base<_tp,_alloc, _alloc_traits<_tp, _alloc>::_s_instanceless> ; // _m_map的初始大小為8

...

}// 初始化__num_elements個節點,最小結點數8個

template void

_deque_base<_tp,_alloc>::_m_initialize_map(size_t __num_elements)

__stl_unwind((_m_deallocate_map(_m_map, _m_map_size),

_m_map = 0, _m_map_size = 0));

_m_start._m_set_node(__nstart);

_m_finish._m_set_node(__nfinish - 1);

_m_start._m_cur = _m_start._m_first;

_m_finish._m_cur = _m_finish._m_first +

__num_elements % __deque_buf_size(sizeof(_tp));

}

template

class

deque : protected _deque_base<_tp, _alloc>;

// 注意swap的實現

void swap(deque& __x)

// 當push_front, push_back, insert, resize新增元素超出原空間時,需要

// 重新分配空間map,將原來的_m_map拷貝到新map中,並沒有copy緩衝區的元素

template

void

deque

<_tp,_alloc>::_m_reallocate_map(size_type __nodes_to_add,

bool __add_at_front)

else

_m_start._m_set_node(__new_nstart);

_m_finish._m_set_node(__new_nstart + __old_num_nodes - 1);

}

sgi stl

cppreference.com

STL 原始碼閱讀

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

STL原始碼閱讀 二

vector的記憶體分配基類 template class vector alloc base vector alloc base的偏特化版本,不需要儲存記憶體分配器 template class vector alloc base tp,allocator,true template struct...

STL原始碼閱讀 七

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