c++ vector用法詳解

雲夢士發表於2021-07-19

1. 定義:

向量(Vector)是一個封裝了動態大小陣列的順序容器(Sequence Container)可以認為是一個動態陣列,其中一個vector中的所有物件都必須是同一種型別的。

2. 建構函式:

2.1 一般情況

  • vector vecName(); // 構造一個空vector,其中包含的物件為int型別
  • vector vecName(3); // 構造一個空vector,其中包含的物件為int型別,大小為3
  • vector vecName(3,value); // 構造一個空vector,其中包含的物件為int型別,大小為3,物件均為value
  • vector vecName = { 1, 2, 3, 4 }; // 構造一個vector,初始值為[1,2,3,4]
  • vector vecName(vecName2); // 構造一個vector,初始值為另一個vector型別的vecName2

2.2 將vec1的部分賦給vec2

  • vector::const_iterator First = vec1.begin() + 1; // 找到開始迭代器
  • vector::const_iterator Second = vec1.begin() + 4; // 找到結束迭代器
  • vector vec2(First, Second); // 將值直接初始化到vec2(需要注意包括開頭,但不包括結尾,即vec2只包含vec[1]到vec[3]的元素)

2.3 二維陣列構造方法

  • vector<vector > vecName(3); // 構造一個二維vector,其中一個維度為3
  • vector<vector > vecName(3,vector(4)); // 構造一個3*4 的二維vector,其中預設值為0
  • vector<vector > vecName(3, vector(4,1)); // 構造一個3*4 的二維vector,值均為1
  • vector<vector > vecName = { {1, 2, 3}, {4, 5, 6} }; // 構造一個2*3 的二維vector,並賦值

3. 增加元素:

  • vec1.push_back(x); // 在vec1的尾部新增一個元素x(注意:一般可以用emplace_back()代替,效率更高)
  • vec1.insert(iterator iter, x); // 在vec1的迭代器iter指向元素前增加一個元素x
  • vec1.insert(iterator iter, int n, x); // 在vec1的迭代器iter指向元素前增加n個元素x
  • vec1.insert(iterator iter, const_iterator first,const_iterator last); // 在vec1的迭代器iter指向元素前插入另一個相同型別向量的[first,last)間的資料

4. 刪除元素:

  • vec1.pop_back(); // 刪除在vec1的最後一個元素
  • vec1.clear(); // 刪除vec1中所有元素
  • vec1.erase(iterator iter); // 刪除vec1中迭代器指向元素
  • vec1.erase(iterator first,iterator last); // 刪除vec1中[first,last)中元素

5. 使用元素:

5.1 一般使用法

  • vec1[1]; // 使用下標方式
  • vec1.at(1); // 使用at方式
  • vec1.front(); // 使用第一個元素
  • vec1.back(); // 使用最後一個元素

5.2迭代器指標使用法:

  • iterator begin(); // 返回向量頭指標,指向第一個元素
vector<int>::iterator d = vec1.begin();
int d1 = *d;//vec1[0]
  • iterator end(); // 返回向量尾指標,指向向量最後一個元素的下一個位置
vector<int>::iterator e = vec1.end() - 1;
int e1 = *e;//vec1[last]`

反向迭代器,是從後往前數的,即+1代表向前數一個元素

  • reverse_iterator rbegin(); // 反向迭代器,指向最後一個元素
vector<int>::reverse_iterator f = vec1.rbegin();
int f1 = *f;//vec1[last]`
  • reverse_iterator rend(); // 反向迭代器,指向第一個元素之前的位置,也就是vector[-1]
vector<int>::reverse_iterator g = vec1.rend() - 1;
int g1 = *g;//vec1[0]

6. 判斷是否為空:

  • bool empty() const:判斷向量是否為空,若為空,則向量中無元素
vector<int> vec1 = { 1, 2, 3, 4, 5 };
bool i = vec1.empty();//輸出:false
vector<int> vec2 = {  };
bool j = vec2.empty();//輸出:true

7. 大小函式:

  • unsigned int length = vec1.size()//vec1所含元素的個數

8. 使用時的注意事項:

8.1 標頭檔案及其名稱空間

#include<vector>
using namespace std;

8.2 Vector 作為函式的返回值時,

方法一:vector<int> fun1(int num);(不推薦)
方法二:bool fun1(int num, vector<int> $&$vec);(推薦)

8.3 將vec2中的內容追加到vec1的後面:

vec1.insert(vec1.end(), vec2.begin(), vec2.end());

8.4 最大最小元素及其索引:

#include<algorithm>
vector<double>::iterator biggest = max_element(begin(vec1), end(vec1));
double biggestValue = *biggest;//最大值
int biggestIndex = distance(begin(begin(vec1), biggest);//最大值索引
vector<double>::iterator smallest = min_element(begin(vec1), end(vec1));
double smallestValue = *smallest;//最大值
int smallestIndex = distance(begin(begin(vec1), smallest);//最大值索引