vector的本質還是數組,但是可以動態的增加和減少數組的容量(當數組空間內存不足時,都會執行: 分配新空間(容量為2^n)-復制元素-釋放原空間),首先先講講vector和數組的具體區別
一、vector和數組的區別
- vector封裝了很多數組沒有的方法,可以更方便的處理數據;數組相比起vector就少了很多
- 二維vector在聲明中可以方便的初始化;數組需要用cstring庫里面的memset函數來初始化(且只能直接初始化為0或-1)
- 在一維vector和一維數組;內存都是連續的
- 在二維vector中,第二維的內存不是連續的,但是第一維是連續的;二維數組中內存是連續的
下面是樣例代碼
#include<cstdio> #include<vector> #include<cstring> using namespace std; int main() { // 普通數組的聲明並且初始化 int a_arr[3]; memset(a_arr, -1, sizeof(a_arr)); // vector可以更方便的初始化 ,且可以初始化為任何值 vector<int> a_vector(3,50); for(int i=0;i<3;i++) printf("%d ",a_arr[i]); printf("\n"); for(int i=0;i<3;i++) printf("%d ",a_vector[i]); printf("\n"); printf("\n一維上數組和vector的內存都是連續的\n"); // 一維上數組和vector的內存都是連續的 for(int i=0;i<sizeof(a_arr)/sizeof(int);i++) printf("%d ", &a_arr[i]); printf("\n"); for(int i=0;i<a_vector.size();i++) printf("%d ", &a_vector[i]); printf("\n"); int b_arr[3][3]; memset(*b_arr, -1, sizeof(b_arr)); // vector<vector <int > > b_vector(3,(3)); 自動初始化為0 vector<vector <int > > b_vector(3,vector<int>(3,50)); // 初始化為50 printf("\n二維上數組和vector的內存有差異\n"); // 地址是連續的 for(int i=0;i<3;i++) for(int j=0;j<3;j++) printf("b_arr[%d][%d]的地址為:%d\n", i, j, &b_arr[i][j]); // 地址不是連續的 for(int i=0;i<3;i++) for(int j=0;j<3;j++) printf("b_vector[%d][%d]的地址為:%d\n", i, j, &b_vector[i][j]); // 由於地址不是連續的所以下面的訪問方式vector不適用 for(int i=0;i<9;i++) printf("%d ",b_arr[0][i]); printf("\n"); for(int i=0;i<9;i++) printf("%d ",b_vector[0][i]); // 至於為什么vector越界訪問的第一個值(也就是vector[0][3])總是0,我猜測是為了更快的push,順便也初始化了 return 0; }

好了,看到了他們的區別現在再來講講vector什么時候用?怎么用?用的時候要注意些什么?
二、什么時候用
在需要使用數組而且不能確定數組的容量,但是又不想開太大的普通數組的時候,可以使用vector。
三、怎么用
| 方法名稱 | 解釋 |
| v.capacity() | 容器容量 |
| v.size() | 容器大小 |
| v.at(int idx) | 用法和[]運算符相同 |
| v.push_back() | 尾部插入 |
| v.pop_back() | 尾部刪除 |
| v.front() | 獲取頭部元素 |
| v.back() | 獲取尾部元素 |
| v.begin() | 頭元素的迭代器 |
| v.end() | 尾部元素的迭代器 |
| v.insert(pos,elem) | pos是vector的插入元素的位置 |
| v.insert(pos, n, elem) | 在位置pos上插入n個元素elem |
| v.insert(pos, begin, end) | |
| v.erase(pos) | 移除pos位置上的元素,返回下一個數據的位置 |
| v.erase(begin, end) | 移除[begin, end)區間的數據,返回下一個元素的位置 |
| reverse(pos1, pos2) | 將vector中的pos1~pos2的元素逆序存儲 |
下面這段代碼可以讓大家初步了解到vector的使用,並且觀察到vector動態申請數組的過程
#include<cstdio> #include<vector> #include<cstring> using namespace std; int main() { vector<int> a; for(int i=0;i<5;i++) { a.push_back(i); printf("%d %d\n", a.capacity(), a.size()); } printf("\n"); for(int i=0;i<3;i++) { int num = a.back(); a.pop_back(); printf("%d %d %d\n",a.capacity(),a.size(),num); } return 0; }

四、用的時候要注意什么?
- vector自帶了insert和erase來再vector中任意位置來插入元素,但是離尾部越遠效率越低,所以需要頻繁的在元素中任意位置插入刪除元素可以選用其它的容器,比如list
- 還有就是通過下標訪問的時候不要越界訪問。
參考於:https://blog.csdn.net/weixin_41588502/article/details/87978490
