std::reserve和std::resize的區別

danshiming發表於2020-10-01

std::reserve是設定容器容量的,呼叫該函式後,容器的capacity可能會變大或不變,但不會變小

如:

    vector    value{ 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47 };
    int k = value.capacity();
    value.reserve(2);
    int k1 = value.capacity();

 

在我本機上例k、k1都為15,即和value.size()大小相等,k1並不是2,如果將

 value.reserve(2)改為 value.reserve(20),則k為15,k1為20

可以看到當reserve設定的引數比容器實際存放的元素個數小,則容器的capacity()不會變化,不會變小;當reserve設定的引數比容器實際存放的元素個數大,則容器的capacity()會增大至reserve設定的引數大小。

resize是改變容器內實際存放的元素個數的,注意和容器容量的區別,一般地容器容量>=容器實際存放元素個數。

繼續以上例講解:

    vector  value{ 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47 };
    int k = value.capacity();
    value.reserve(2);
    int k1 = value.capacity();
    value.resize(100);
    k1 = value.capacity();

通過resize(100)將容器實際存放的元素擴大到100個後,因為原來的capacity()只有15個,存放不了100個元素,故容器內部也會自動將容量擴容,這裡在我本機k1變為了100。

    int k = value.capacity();
    value.reserve(2);
    int k1 = value.capacity();
    value.resize(100);
    k1 = value.capacity();
    value.resize(10);
    k1 = value.capacity();

上例通過.resize(10)將實際存放的元素變為了10個(當需要減小容器的大小時,會移除多餘的元素。),其後的容量

k1依然是100,即不會縮小。

 

綜上:

std::reserve是設定容器容量的,呼叫該函式後,容器的capacity可能會變大或不變,但絕對不會比沒用呼叫該函式之前的還小。

resize是改變容器內實際存放的元素個數的,只有改變的大小超過了capacity時,capacity才會變大。

resize變小時,capacity不會影響。

一般地容器容量>=容器實際存放元素個數。

 

std::vector的reserve和resize的區別》這篇文章也值得一看

 

相關文章