Vector容器的一點說明

1. resize 與 reserve

先看一個簡單的例子:

//使用resize
std::vector<int> vec1;
vec1.resize(10);
vec1.push_back(10);  // 第11個元素
vec1.push_back(10);  // 第12個元素
// 使用reserve
std::vector<int> vec2;
vec2.reserve(10);
vec2.push_back(10);  // 第1個元素
vec2.push_back(10);  // 第1個元素

通過查看vector的源代碼,就可以很容易地看到:

>> resize(10)使用10個默認初值(此處爲0)的對象(int類型)去填充10個區域,這可以通過vec1.size()獲得的vec1的大小驗證,如果要改變這10個元素的值,可用直接使用vec1[0] = 10....

>> reserve(10)僅僅是預分配 10個int類型的空間,而不改變vector的大小(vec1.size() = 0)

 

2. swap 與 clear

 從兩個函數的名字就可以清楚地瞭解到:swap是用於交換兩個容器的內容,clear是用於清空當前的容器。這裏要說明的是,swap與clear都可以用以“清空”當前的容器(涉及到swap的巧妙用法)。不過兩者對vector的底層影響並不一樣。看看下面的代碼: 

// 使用clear
std::vector<int> vec1;
for (int i = 0; i < 10; ++i) {
    vec1.push_back(10);
} // size = 10, capacity >= 10(13)
vec1.clear(); // size = 10, capacity不變
// 使用swap
std::vector<int> vec2;
for (int i = 0; i < 10; ++i) {
    vec2.push_back(10);
} // size = 10, capacity >= 10(13)
vec2.swap(std::vector<int>()); // size = 0, capacity = 0

可以看出:clear僅僅清空vecotr中的數據,而不改變vector的實際物理空間大小。swap能夠徹底改變vector的物理空間(這點往往很重要)。

 

3. 對象元素的一些說明

在vector中插入對象(class)要注意對象的構造與析構所引起的額外消耗,如:函數調用的系統消耗,函數本身的消耗等。即使一個空的構造/析構函數,對於數量非常龐大的函數調用的開銷還是不能不考慮的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章