// 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使用紅黑樹實現,...