C++ vector應用介紹

Gordon Fang
4 min readNov 1, 2018

--

相關圖片

什麼是Vector?
Vector以成員角度來看是類C++標準函式庫的類別(Class),可視之為動態陣列,能適時自動擴充容量,以循序(Sequenital)方式維護資料。

資料存放在連續記憶體,以至於可使用迭代器追蹤資料,方便存取,在Vector類別裡,資料的新增是加在末端,在尾端刪除通常只要費時常數時間,反之,若在頭、中間新增或刪除資料則需要耗費線性時間。

此外Vector能透過泛型(Template),保存任意類型的變數,包括使用者自定義的資料型態,例如整數型態(int)、字串型態(string)、或是自行定義的資料型態等。

Vector特色

  • 支持隨機存取
  • 末尾資料刪除耗費時間:O(1)
  • 中間資料插入、刪除耗費時間:O(n)
  • 利用泛型(Template),保存任意類型的變數,包括自定義的資料型態

Vector方法

存取元素的方法

  • vec[i] - 存取索引值為 i 的元素參照。 (索引值從零起算,故第一個元素是vec[0]。)
  • vec.front() - 回傳 vector 第一個元素的參照。
  • vec.back() - 回傳 vector 最尾端元素的參照。

新增或移除元素的方法

  • vec.push_back() - 新增元素至 vector 的尾端,必要時會進行記憶體配置。
  • vec.pop_back() - 刪除 vector 最尾端的元素。
  • vec.insert() - 插入一個或多個元素至 vector 內的任意位置。
  • vec.erase() - 刪除 vector 中一個或多個元素。
  • vec.clear() - 清空所有元素。

取得長度/容量

  • vec.size() - 取得 vector 目前持有的元素個數。
  • vec.empty() - 如果 vector 內部為空,則傳回 true 值。
  • vec.capacity() - 取得 vector 目前可容納的最大元素個數。這個方法與記憶體的配置有關,它通常只會增加,不會因為元素被刪減而隨之減少。

重新配置/重設長度

  • vec.reserve() - 如有必要,可改變 vector 的容量大小(配置更多的記憶體)。在眾多的 STL 實例,容量只能增加,不可以減少。
  • vec.resize() - 改變 vector 目前持有的元素個數。

迭代 (Iterator)

  • vec.begin() - 回傳一個Iterator,它指向 vector 第一個元素。
  • vec.end() - 回傳一個Iterator,它指向 vector 最尾端元素的下一個位置(請注意:最後一個元素的下一個位置)。
  • vec.rbegin() - 回傳一個反向Iterator,它指向 vector 最尾端元素的。
  • vec.rend() - 回傳一個Iterator,它指向 vector 的第一個元素的前一個位置。

實戰練習

新增、刪除、存取資料

排序

題目練習

練習題1. Leetcode 中序節點拜訪

解法詳情請參考資料結構課本

練習題2. Leetcode 尋找陣列中消失的數字

思維:利用迴圈,每讀一個元素(取絕對值,有些元素可能是負數),我們去算出它排序後的正確位子(索引),將那個位子上的元素標記上負號,若該元素是標記過的(即負數),我們則跳過這個目前讀取元素。

最後,我們去看哪些元素是還沒標記上,他們索引值加上1,即為消失的數字。

--

--

Gordon Fang
Gordon Fang

Written by Gordon Fang

Hi 我是 Gordon,目前是自然語言實驗室的研究生,曾經是金融業軟體工程師,我對大語言模型、設計模式、Linux、平面設計都有涉略,歡迎相互交流。

No responses yet