C++實踐:STL容器reserve

咱們在使用一些容器類型時,若是事先能大致知道存儲空間的大小,使用成員函數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輸出以下:ios

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

之因此出錯能夠歸爲兩點:c++

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

補充一句:Rust的默認的operator[]行爲等價於C++的std::vector::at,運行時會報錯。編程

文章已同步到公衆號,微信號: pltfan,二維碼以下:
編程fan微信

相關文章
相關標籤/搜索