我們在使用一些容器型別時,如果事先能大體知道儲存空間的大小,使用成員函式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
之所以出錯可以歸為兩點:
- 容器的
capacity
和size
是兩個概念,不可混淆
前者是容器實際分配的記憶體大小,後者是容器記憶體儲的元素個數。很明顯,capacity >= size
。程式碼中的的reserve
實際上改變capacity
,沒有改變size
。要改變size
,可以使用push_back
等成員函式。 -
!!執行時不報錯
因效率考量,operator[]
操作不進行邊界檢查。要求我們不能違背C++的“慣用法”,否則編譯器也幫不了我們。
對應的邊界檢查版本std::vector::at
。
補充一句:Rust的預設的operator[]
行為等價於C++的std::vector::at
,執行時會報錯。
文章已同步到公眾號,微訊號: pltfan,二維碼如下: