[英]Is std::vector::reserve(0); legal?
是std::vector::reserve(0);
合法,它會做什么?
沒有什么可以禁止的。 reserve
的影響是:
在reserve()之后,如果重新分配,capacity()大於或等於reserve的參數; 並且等於capacity()的先前值。 當且僅當當前容量小於reserve()的參數時,才會發生重新分配。 1
由於capacity()
的值永遠不會小於0(它是無符號的),因此它永遠不會有任何影響; 它永遠不會導致重新分配。
1. c ++標准,[vector.capacity]
是的,這是一個合法的無操作。
如果
new_cap
大於當前capacity()
,則分配新存儲, 否則該方法不執行任何操作。
( 來源 ,強調我的。)
由於capacity()
總是> = 0(由於size_type
是無符號的),傳遞零保證什么都不做。
這是合法的,不會保留空間。 雖然如果呼叫低於其容量,呼叫將不執行任何操作。
根據C ++標准
在reserve()之后,如果重新分配,capacity()大於或等於reserve的參數; 並且等於capacity()的先前值。 當且僅當當前容量小於reserve()的參數時,才會發生重新分配 。
因此,如果reserve的參數等於0,則根本不會重新分配。
函數本身僅在一種情況下拋出異常
拋出:length_error如果n> max_size()。
考慮到reserve( 0 )
不等於resize( 0 )
。 在最后一種情況下,將刪除向量的所有元素。
該文檔為此提供了明確的答案:
將容器的容量增加到大於或等於
new_cap
。 如果new_cap
大於當前capacity()
,則分配新存儲,否則該方法不執行任何操作。
capacity()
返回一個不能為負的值。 因此,為new_cap
傳遞零總是落入第二類 - 即函數什么也不做。
void reserve (size_type n);
如果n大於當前向量容量,則該函數使容器重新分配其存儲,將其容量增加到n(或更大)。
在所有其他情況下,函數調用不會導致重新分配,並且矢量容量不會受到影響。
首先,您應該嘗試理解Vector的工作原理。 它是一個保留內存的數組,以便在需要存儲新值時使用它,以便更快更有效地執行插入操作。
使用std::vector::reserve()
您可以確定要保留的內存量(在您的情況下為零)。
如果你想為你的向量添加另一個值並且保留空間為零,它將完全沒有問題,但操作會更慢。 如果你想為很多值做這件事可能會有問題,但如果你只做幾次,你可能不會注意到這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.