簡體   English   中英

是std :: vector :: reserve(0); 法律?

[英]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.

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