2011-10-24 147 views
0

我正在調查std::set的代碼。我看到insert簽名爲_Pairib insert(const value_type& _Val)。爲什麼通過引用傳遞輸入參數?我知道standardcContainers將它們的元素複製到容器的內存中。有人知道這是如何實現的嗎?分配者進入圖片的位置在哪裏?任何解釋如何存儲/插入元素的小代碼/僞代碼都將被讚賞。我有興趣瞭解如何完成複製。STL容器插入元素

回答

2

分配器是一個模板參數。看看定義here

template < class Key, class Compare = less<Key>, 
      class Allocator = allocator<Key> > class set; 

如果不指定自己的分配器,將採取默認的分配器(這很可能只是一個new)。

您可以在具有公共副本構造函數,析構函數和賦值運算符的類上使用STL包含器。見here:插入STL容器

元素可以是 供給公共拷貝構造,公共析構函數,和一個公共 賦值運算符的任何對象類型。析構函數不能拋出異常。 此外,關聯容器(如集合和地圖)必須定義一個 公共比較運算符,默認爲運算符<。 容器上的某些操作可能還需要公共默認構造函數和公共等價運算符。

所以基本上這個複製是通過使用你在類中實現的上述公共成員函數完成的。

+0

那麼STL調用用戶定義類型的拷貝構造函數,並創建對象到分配器創建的區域中? – Avinash

+0

@Avinash - 是的。 – littleadv

+0

謝謝,你知道我如何在C++中做到這一點,我的意思是我需要使用新的位置來實現這一點。 – Avinash

2

爲什麼輸入參數作爲參考被傳遞。

如果按值取值,則需要兩個副本:一個用於函數參數,另一個用於容器節點。

分配器來自哪裏。

容器請求分配器分配和初始化通常包含元素類型的私有節點類型以及其他信息,如指向其他節點的指針。

我有興趣瞭解副本是如何完成的。

私有節點類型將保存傳遞給insert的參數的副本。