的方法並不複雜。基本上容器將從分配器獲得內存,然後執行復制構建(通過該內存的放置 - 新的)。該容器更容易看到的是vector
:
void push_back(T const & value) {
ensure_enough_capacity();
new (end_ptr++) T(value);
}
凡ensure_enough_capacity()
確定矢量是否有成長,做它,就是它最終會調用如果size()==capacity()
時push_back
被稱爲分配器。
複雜程度的下一個層次是list
,其中每個節點都是獨立分配的,並且還有一些額外的信息需要管理。在這種情況下,代碼將類似於:
void push_back(T const& value) {
node* n = allocator::allocate(sizeof(node));
new (n) node(value, x, y);
}
凡x
和y
是適當的指針來初始化節點的next
和last
指針(通常是一個指向最後一個節點爲last
和指針哨兵節點 - 無效結束 - 對於next
),並假設此特定構造函數將copy-constructvalue
然後修復所有引用的指針。
有序關聯容器具有管理平衡樹的額外複雜度,但方法是相同的:分配一個足以容納該值和額外信息的塊,然後使用放置 - 新建來構建節點。其餘的是數據結構的細節。
@馬塞洛坎託斯,我明白它使用複製構造函數。但是以std :: map爲例,現在忘記了比較邏輯,當新節點實際添加到樹中時會發生什麼。 – Avinash
我不太確定你到底在問什麼......你關心的是對象是如何分配的或者將節點放在容器中的算法是什麼?分配器將用於獲取新節點的內存,並且將使用* placement-new *調用node的構造函數,構造函數將初始化其自己的數據結構,並且* copy-construct *其「T」數據成員。如果你擔心RB-Tree(或任何其他平衡二叉搜索樹的實現,我建議你谷歌或檢查維基百科) –
@DavidRodríguez - dribeas:我感興趣的是知道STL如何爲每個元素分配內存,其實我試圖找出在STL類 – Avinash