1. 程式人生 > >C++ STL 之 vector 的 capacity 和 size 屬性區別

C++ STL 之 vector 的 capacity 和 size 屬性區別

C++ STL 之 vector 的 capacity 和 size 屬性區別

size 是當前 vector 容器真實佔用的大小,也就是容器當前擁有多少個容器。

capacity 是指在發生 realloc 前能允許的最大元素數,即預分配的記憶體空間。

當然,這兩個屬性分別對應兩個方法:resize() 和 reserve()。

使用 resize() 容器內的物件記憶體空間是真正存在的。

使用 reserve() 僅僅只是修改了 capacity 的值,容器內的物件並沒有真實的記憶體空間(空間是"野"的)。

此時切記使用 [] 操作符訪問容器內的物件,很可能出現數組越界的問題。

下面用例子進行說明:

#include <iostream>
#include <vector>

using std::vector;
int main(void)
{
    vector<int> v;
    std::cout<<"v.size() == " << v.size() << " v.capacity() = " << v.capacity() << std::endl;
    v.reserve(10);
    std::cout<<"v.size() == " << v.size() << " v.capacity() = " << v.capacity() << std::endl;
    v.resize(10);
    v.push_back(0);
    std::cout<<"v.size() == " << v.size() << " v.capacity() = " << v.capacity() << std::endl;

    return 0;
}

執行結果為:(win 10 + VS2010)

注: 對於 reserve(10) 後接著直接使用 [] 訪問越界報錯(記憶體是野的),大家可以加一行程式碼試一下,我這裡沒有貼出來。

這裡直接用[]訪問,vector 退化為陣列,不會進行越界的判斷。此時推薦使用 at(),會先進行越界檢查。

相關引申:

針對 capacity 這個屬性,STL 中的其他容器,如 list map set deque,由於這些容器的記憶體是雜湊分佈的,因此不會發生類似 realloc() 的呼叫情況,因此我們可以認為 capacity 屬性針對這些容器是沒有意義的,因此設計時這些容器沒有該屬性。

在 STL 中,擁有 capacity 屬性的容器只有 vector 和 string。