簡體   English   中英

std :: vector :: assign - 重新分配數據?

[英]std::vector::assign - reallocates the data?

我正在使用STL庫,我的目標是最小化數據重新分配的情況。 我在想,是嗎?

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

如果大小未更改或者實際上只是分配新值(例如,使用operator =),則重新分配數據?

http://www.cplusplus.com/上的STL文檔sais如下(C ++ 98):

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

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

短語“沒有元素的分配發生”使得這一切都有點令人困惑。

所以例如,我想要一個類的向量(例如,OpenCV的cv :: Vec3i)。 這是否意味着,那

  1. 將調用cv :: Vec3i的析構函數或構造函數?
  2. 將制作Vec3i內存的直接副本並填充向量?
  3. 如果我的類在運行時使用new運算符分配內存會發生什么? 普通內存復制無法解釋此內存。 這是不是意味着,assign()不應該用於這樣的對象?

編輯:在這種情況下使用assign的全部目的是將向量中的所有值設置為0(如果我有std :: vector <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感興趣

如果不需要增長它, std::vector.assign(...)不會重新分配該向量。 但是,它必須復制實際元素。

如果您想知道標准保證什么,請查看標准: C ++ 11標准以及次要的編輯更改。

我假設你有一個載有一些數據的向量,你在它上面調用一個賦值,這將:

  1. 銷毀向量的所有元素(它們的析構函數被調用)就像調用clear()
  2. 使用給定對象的n個副本填充now-empty向量,該副本必須具有復制構造函數。

因此,如果您的類分配了一些內存,您必須:

  1. 在你的拷貝構造函數中處理這個問題
  2. 在析構函數中釋放它

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

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

assign的語義以一種非常直接的方式定義為標准:

void assign(size_type n,const T&t);

功效:

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

這意味着首先將調用元素的析構函數。 t的副本是在元素結束的生命周期之后留下的原始存儲中創建的。

要求是value_typeMoveAssignable (當erase不擦除到容器的末尾並且需要將元素移動到開頭時)。

這里使用的insert重載要求value_typeCopyInsertableCopyAssignable.

無論如何,vector無視你的班級如何管理自己的資源。 這是你要照顧的。 三法則。

vector::resize方法一樣,

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

將每個元素初始化為“val”副本 我更喜歡使用resize因為它最大限度地減少了對象實例/破壞的數量,但它也是如此。 如果要最小化數據realloc,請使用resize ,但請記住以下內容:

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

如果您的類動態分配數據,那么您應該重新實現YourClass::operator=以將數據復制到新對象而不是復制指針。

希望它有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM