![](/img/trans.png)
[英]does std::vector::resize() downward take O(1) time if the element type is a primitive?
[英]std::vector resize downward
C ++標准似乎沒有通過resize(n)
, n < size()
或clear()
來聲明容量的副作用。
它確實聲明了關於push_back
和pop_back
攤銷成本 - O(1)
我可以設想一種實現通常的容量變化和CLRS算法(例如,當放大時加倍,當將size to < capacity()/4
減小size to < capacity()/4
時減半)。 (Cormen Lieserson Rivest Stein)
有沒有人參考任何實施限制?
調用較小大小的resize()
對vector
的容量沒有影響。 它不會釋放內存。
從vector
釋放內存的標准習慣是將它與一個空的臨時vector
swap()
: std::vector<T>().swap(vec);
。 如果要向下調整大小,則需要從原始向量復制到新的本地臨時向量,然后將生成的向量與原始向量交換。
更新:為此目的,C ++ 11添加了一個成員函數shrink_to_fit()
,它是一個將capacity()
減小到size()
的非綁定請求。
實際上,該標准確實指明了應該發生的事情:
這是來自vector
,但主題對於所有容器都是相同的( list
, deque
等...)
23.2.4.2向量容量[lib.vector.capacity]
void resize(size_type sz, T c = T());
6)效果:
if (sz > size())
insert(end(), sz-size(), c);
else if (sz < size())
erase(begin()+sz, end());
else
; //do nothing
也就是說:如果指定resize
小於元素數,則這些元素將從容器中刪除。 關於capacity()
,這取決於erase()
對它的作用。
我無法在標准中找到它,但我很確定clear()
被定義為:
void clear()
{
erase(begin(), end());
}
因此, clear()
對capacity()
的影響也與erase()
對其產生的影響有關。 根據標准:
23.2.4.3向量修飾符[lib.vector.modifiers]
iterator erase(iterator position);
iterator erase(iterator first, iterator last);
4)復雜性:T的析構函數被稱為等於被刪除元素數量的次數....
這意味着元素將被破壞,但內存將保持不變。 erase()
對容量沒有影響,因此resize()
和clear()
也沒有效果。
容量永遠不會減少。 我不確定標准是否明確說明了這一點,但暗示:如果n < capacity()
則不能通過resize(n)
使迭代器和向量元素的引用無效。
當我檢查gcc(mingw)時,釋放矢量容量的唯一方法就是mattnewport所說的。 用其他teporary向量交換它。 這段代碼適用於gcc。
template<typename C> void shrinkContainer(C &container) {
if (container.size() != container.capacity()) {
C tmp = container;
swap(container, tmp);
}
//container.size() == container.capacity()
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.