C++實踐:STL容器reserve

ideami發表於2017-08-06
我們在使用一些容器型別時,如果事先能大體知道儲存空間的大小,使用成員函式reserve可以有效減少容器重新分配記憶體的次數。

下面的程式碼從實際專案改編而來。
#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers;
    numbers.reserve(3);

    numbers[0]=10;
    numbers[1]=20;

    std::cout << "The size of numbers: " << numbers.size() << std::endl;
    std::cout << "The first elem of numbers: " << numbers[0] << std::endl;
    std::cout << "The second elem of numbers: " << numbers[1] << std::endl;

    return 0;
}

上面程式使用clang++/g++ -std=c++17輸出如下:

The size of numbers: 0
The first elem of numbers: 10
The second elem of numbers: 20

之所以出錯可以歸為兩點:

  1. 容器的capacitysize是兩個概念,不可混淆
    前者是容器實際分配的記憶體大小,後者是容器記憶體儲的元素個數。很明顯,capacity >= size。程式碼中的的reserve實際上改變capacity,沒有改變size。要改變size,可以使用push_back等成員函式。
  2. !!執行時不報錯
    因效率考量,operator[]操作不進行邊界檢查。要求我們不能違背C++的“慣用法”,否則編譯器也幫不了我們。
    對應的邊界檢查版本std::vector::at

補充一句:Rust的預設的operator[]行為等價於C++的std::vector::at,執行時會報錯。

文章已同步到公眾號,微訊號: pltfan,二維碼如下:
程式設計fan

相關文章