我正在使用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)。這是否意味着,
- cv :: Vec3i的析構函數或構造函數將被調用?
- Vec3i內存的直接副本將製作並填充矢量?
- 如果我的類在運行時分配內存新的 運算符會發生什麼?這個內存不能由普通內存 複製佔。這是否意味着,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
要最小化重新分配,請使用'std :: shared_ptr'。您可以自由地將這些指針從一個容器複製到另一個容器,只是指針本身被複制。使用「只讀」對象的方法,它應該解決這個問題。 – Flovdis
它可能意味着「不分配元素......」是新元素是從參數複製構建的,並且沒有複製分配發生。因此,如果你有一個明確的存儲類型的複製ctor,那麼你應該沒有問題。 – bstamour
@Flovdis不共享Ctr 11的ptr部分?以爲我們在這裏討論的是C++ 98 .. –