介紹
- vector(向量)是大小可變的序列容器
- 和數組相似,順序存儲,可使用下标通路(随機通路),但不同的是,vector大小可以動态改變,且是自動變化(容器自己處理的)
- vector非常有效地通路其元素(就像數組一樣)并且相對有效地從其末尾添加或删除元素,例如cout<<iv[i];這是可以的。對于在末尾以外的位置插入或删除元素的操作,它們的性能比其他位置差。
- 雖然通路像數組一樣,可以根據下标随機通路,但是它的插入不能根據下标像數組一樣插入,例如cin>>iv[i];這是錯誤的
基本操作
詳見官方http://www.cplusplus.com/reference/vector/vector/
- 必須引用的包
#include <vector>
- 聲明
vector<int> iv;//也可選擇存double型等,不一定是int型
- 末尾添加元素
iv.push_back(x);
- 末尾删除元素
iv.pop_back();
- 任意位置插入
iv.insert (iv.begin()+i,2,100);//第一個表示在第i+1個位置前面插入;第二個表示插入兩個同樣的數值;第三個表示插入數值為100
iv.insert (iv.begin(),100);//第一個表示在第一個位置處插入;第二個表示插入一個數值100
- 任意位置删除
iv.erase (iv.begin()+i);//删除第i+1個元素
iv.erase (iv.begin(),iv.begin()+3);//删除第一個到第三個元素(總共三個)
- 使用下标通路
cout<<iv[0]<<endl;//下标從0開始
- 開始指針,末尾指針
iv.begin();//指向第一個元素的位置(即下标0的位置)
iv.end();//指向最後一個元素的下一個位置
- 疊代器通路
vector<int>::iterator it;
for(it=iv.begin();it!=iv.end();it++)
cout<<*it<<endl;
//或者
for (int i = 0; i < iv.size(); i++) {
cout << iv[i] << endl;
}
- 向量大小 iv.size();
- 向量清除 iv.clear();
- 向量判空 iv.empty();
- 通路第一個元素 iv.front();
- 通路第二個元素 iv.back();
- 元素翻轉
```
#include <algorithm>//元素翻轉必須引用
reverse(iv.begin(), iv.end());
```
- 元素排序
```
#include <algorithm>//元素排序必須引用
sort(iv.begin(), iv.end());//預設是從小到大排序
```
```
//此處是從大到小排序
#include <algorithm>//元素排序必須引用
bool cmp(const int a,const int b)
{
return a > b;
}
sort(iv.begin(),iv.end(),cmp);
```
- 調整容器大小 iv.resize(10)
resize會改變容器的容量和目前元素個數,并配置設定了記憶體,容器大小變成了10,不會改變之前容器裡面已有的元素,後面會自動添加元素,預設值為0
換句人話:
vector< int > iv;
for ( int i=0; i<3;++i)
{
vecInt.push_back(i);
}
現在是裡面有3個元素
iv.resize(10);
iv裡面就有10個元素了,前三個是之前添加的0 1 2,後面7個是預設值0
此時如果執行iv.push_back(5);
然後周遊發現,列印出來的值是0 1 2 +7個0,沒有5
這個真的卡了半天
如果後面想resize(10),然後往裡面正常放資料
vector<int> vIniMatches;
vIniMatches.resize(iniMatchedNum);
int num;
for(vector<int>::iterator i=vIniMatches.begin(), iEnd=vIniMatches.end(); i!=iEnd; i++){
// 此處有操作 num不斷變化的
*i=num;
}