2014-04-14 74 views
4

我正在使用STL庫,我的目標是儘量減少數據重新分配情況。 我wndering,確實std :: vector :: assign - 重新分配數據?

的std ::矢量::分配(size_type的N,const的VALUE_TYPE & VAL)

重新分配的數據,如果尺寸不改變或不被實際只分配新值(例如,使用operator =)?

的STL文件在http://www.cplusplus.com/最高審計機關以下(C++ 98):

在填充版(2),新內容是n個元素,每個初始化爲val的副本。 如果發生重新分配,則使用內部分配器分配所需的存儲空間。

在調用之前在容器中保留的任何元素被銷燬並被新構造的元素替換(不發生元素賦值)。 如果 - 且僅當新矢量大小超過當前矢量容量,則會導致分配的存儲空間自動重新分配。

短語「沒有元素的分配」使這一切都有點混亂。因此,例如,我想要一個類的向量(例如,OpenCV的cv :: Vec3i)。這是否意味着,

  1. cv :: Vec3i的析構函數或構造函數將被調用?
  2. Vec3i內存的直接副本將製作並填充矢量?
  3. 如果我的類在運行時分配內存新的 運算符會發生什麼?這個內存不能由普通內存 複製佔。這是否意味着,assign()不應該用於這樣的對象?

編輯:使用在這種情況下分配的整個目的是在載體中設置所有值設置爲0(如果我已經標準::矢量< CV :: Vec3i> v)中。這將會做很多次。 std :: vector本身的大小不會改變。

我想要做的(在較短的辦法)什麼是以下幾點:

for(int i=0; i<v.size(); i++) 
    for(int j=0; j<3; j++) 
    v[i][j] = 0; 

現在我感興趣的C++ 98

+0

要最小化重新分配,請使用'std :: shared_ptr'。您可以自由地將這些指針從一個容器複製到另一個容器,只是指針本身被複制。使用「只讀」對象的方法,它應該解決這個問題。 – Flovdis

+0

它可能意味着「不分配元素......」是新元素是從參數複製構建的,並且沒有複製分配發生。因此,如果你有一個明確的存儲類型的複製ctor,那麼你應該沒有問題。 – bstamour

+0

@Flovdis不共享Ctr 11的ptr部分?以爲我們在這裏討論的是C++ 98 .. –

回答

0

正如vector::resize方法的情況下,

std::vector::assign(size_type n, const value_type& val) 

將每個元素初始化爲val」一副本「。我傾向於使用resize,因爲它可以最大限度地減少對象實例/破壞的數量,但它的確如此。如果要儘量減少數據重新分配,請使用resize,但請記住以下幾點:

雖然這對於某些數據結構是安全的,但請注意,分配/推送包含指向動態分配數據的類的元素(例如在構造函數中使用new)可能會造成嚴重破壞。

如果您的課程動態分配數據那麼您應該重新實現YourClass::operator=將數據複製到新對象而不是複製指針。

希望它有幫助!

1

我假設你擁有一個充滿一些數據的載體,你調用它的分配,這將:

  1. 破壞載體中的所有元素(它們調用析構函數)一樣調用清除()
  2. 用n個給定對象的副本填充現在爲空的向量,該對象必須有一個拷貝構造函數。

所以,如果你的類分配一些內存,你必須:

  1. 打理這在你的拷貝構造函數
  2. 釋放它在析構函數

的重新分配發生時的大小超過分配的內存(矢量容量)。您可以通過調用reserve()來防止這種情況。不過,我認爲assign()足夠聰明,可以在開始填充向量之前和清除之前分配所需的所有內存(如果這比已經分配的多)。

您可能希望避免因爲成本而重新分配,但如果因爲對象無法正確處理而試圖避免重新分配,那麼我強烈建議您不要將它們放入向量中。

+0

+1。關鍵是「容量」,它至少與舊尺寸一樣大。 – MSalters

1

assign語義是在一個相當簡單的方法中定義的標準:

空隙分配(SIZE_TYPE N,常量Ť&噸);

效果:

erase(begin(), end());
insert(begin(), n, t);

這意味着第一元素的析構函數將被調用。t的副本是在元素生命週期結束後剩下的原始存儲中完成的。

要求是value_typeMoveAssignable(當erase沒有擦到容器的末尾,需要將元素移動到開始位置時)。這裏使用

insert過載要求value_typeCopyInsertableCopyAssignable.

在任何情況下,載體是無視你的類是如何管理自己的資源。這是你要照顧的。請參閱The Rule of Three.

相關問題