C++ Vector 簡單說明與用法

LittleStar21
4 min readDec 4, 2022

--

大家都應該已經知道C/C++陣列常見的問題就是無法控制容量。陣列長度必須是實際數字,再者不能改變。一種解決方法是創建一個很大的陣列,並確保以後不能使用超過已固定限制。 例如:既然學校的學生人數不能超過100,000,000人,我們就造配製那麽多個元素的陣列。雖然這樣能解決以上的問題,但是仍然不合理因為有可能會浪費記憶體。遇到這個困難時,大多數的人常常用std::vector。

首先什麽是std::vector

簡單來說,它是會自己擴張容量大小的陣列。所以我們可以隨便加入或移除元素。

初始化

// 請改成自己要保存的類型(也可以是class)。例如:int, std::string,等等
// 1. 創建一個空的vector叫做names
std::vector<std::string> names;

// 2. 創建一個大小為n個int的vector,每個值都是為0(因爲0是int的預設引數)
std::vector<int> numbers(n);

// 3. 創建一個大小為n個bool的vector,每個值都設為true
std::vector<bool> isStudent(n, true);

// 4. 也可以使用initializer list
std::vector<int> nums{1, 2, 3};

常用的成員函數

// 創建一個空的vector叫做numbers
std::vector<int> numbers;

numbers.resize(3); // 把size改成3,而且有叫default constructor [0, 0, 0]
numbers.push_back(5); // 在尾巴加入5 [0, 0, 0, 5]
numbers.pop_back(); // 移除最後一個元素 [0, 0, 0]
numbers.clear() // 移除所有元素 []

numbers.empty() // 回傳vector是不是空的
numbers.size() // 回傳vector中有多少元素
numbers[x]; // 回傳vector中第x的元素(運算子多載)

// 可能需要移動大部分元素,有點慢
numbers.insert(numbers.begin() + x, 10); // 在陣列中的第x個元素插入10
numbers.erase(numbers.begin() + x); // 移除陣列中的第x個元素

如何改善code讓我們的vector更快呢?其實每次我們加元素時,它會看目前的capacity是否夠。如果夠的話,就直接加入那個元素。否則,他會前先創建新的陣列,然後把所有元素移到新的陣列,再加入那個元素。

size: 陣列中目前有多少元素
capacity: 陣列目前可儲存多少元素

假如我們已經知道目前要放多少元素就不用每次移動或複製元素。

std::vector<std::string> names;
names.reserve(2); // 若目前只有2個名字(以後要改也沒問題)
names.emplace_back("Andy"); // 直接在陣列的尾巴創建std::string("Andy")
names.emplace_back("Ben"); // 不用調整capacity
...

For迴圈

// Index
for (int i = 0; i < names.size(); i++) {
std::cout << names[i] << std::endl;
}

// Iterator
for (auto it = names.begin(); it != names.end(); it++) {
std::cout << *it << std::endl;
}

// Range-based
for (const auto& name : names) {
std::cout << name << std::endl;
}

優點

  • 會自動配置陣列的數目所以很更方便易用。
  • 使用連續的記憶體位址,取什麽元素都很快。

缺點

  • 元素不是保存在曡上(stack)而是在堆上(heap),比較慢。
  • 因為是連續的所以要在中間加入或移除元素很難。

--

--