# vector
# 標頭檔
#include<vector> |
# 構造器 && 初始化
- 默認構造器:empty container constructor
- 批量構造器:fill constructor
- 範圍構造器:range constructor
- 複製構造器:copy constructor
#include<vector> | |
#include<iostream> | |
using namespace std; | |
void print(vector<int> temp) | |
{ | |
cout<<endl; | |
for(auto x: temp) | |
cout<<x<<" "; | |
cout<<endl; | |
} | |
int main(){ | |
vector<int> v1; // 默認構造器 | |
vector<int> v{1,2}; // 默認構造器 | |
vector<int> v2(6,10); // 批量構造器 | |
vector<int> v3(v2.begin(),v2.begin()+5); // 範圍構造器 | |
vector<int> v4(v); // 複製構造器 | |
print(v); | |
print(v2); | |
print(v3); | |
print(v4); | |
return 0; | |
} |
輸出
1 2
10 10 10 10 10 10 //六個10
10 10 10 10 10
1 2
# push_back
&& pop_back
vector 最常用的成員函數,在尾部插入和刪除
# assign
int main(){ | |
vector<int> test; | |
test.assign(2,3); // 批量構造,構造兩個值為 3 的 element | |
print(test); | |
test.assign(2,8); // 會覆蓋原有值 | |
print(test); | |
} |
輸出
3 3
8 8
# insert
在指定位置插入一個或多個值,(位置的類型是反覆運算器), 但若是插入操作過多,使用 vector 時間複雜度會非常高
vector 中插入值時,會將插入值後的所有值依次後移
重載函數 | 形参 |
---|---|
插入單個值 [1] | iterator insert (const_iterator position, const value_type& val); |
多個重複值 [2] | iterator insert (const_iterator position, size_type n, const value_type& val) |
range [3] | iterator insert (const_iterator position, InputIterator first, InputIterator last) |
int main(){ | |
vector<int>test(2,8); | |
vector<int> test1(test); | |
test.insert(test.begin(),3); //[1] | |
print(test); | |
auto ite =test.insert(test.begin(),test1.begin(),test1.end());//[3] | |
print(test); | |
cout<<*ite<<endl; //insert 返回指針地址 | |
} |
輸出
3 8 8
8 8 3 8 8
8
# erase
刪除指定位置的值
重載函數 | 形參 |
---|---|
single | iterator erase (const_iterator position) |
range | iterator erase (const_iterator first, const_iterator last) |
int main(){ | |
vector<int> test; | |
test.assign(4,3); // 批量構造,構造兩個值為 3 的 element | |
test.push_back(66); | |
cout<<"initial element\n"; | |
print(test); | |
test.erase(test.end()-1); // 刪除尾部元素,注意不要越界 | |
print(test); | |
test.erase(test.begin(),test.end()-2);// 刪除操作依舊複雜度高,容易 TLE | |
print(test); | |
} |
輸出
initial element
3 3 3 3 66
3 3 3 3
3 3
# empty
如果 vector
為空, empty
返回 true
;
# size
返回 vector
容器元素個數
# emplace
&& emplace_back
C++11 的新特性,在幾乎所有的容器中都插入了這一函數,這一函數功能類似於 insert
, 但是開銷遠小於 insert
, 它不產生臨時變數
vector<pair<int,double>> vec;//vector 中嵌套 pair | |
vec.push_back(make_pair(1,1.0));// 常用的構造方式 | |
vec.emplace(vec.end(),1,2.0);//emplace 的構造方式 |
方便是方便,但簡單的尾部插入還要寫地址,豈不繁瑣,當然不是,C++11 也提供了 emplace_back
這一函數
vec.emplace_back(1,2.0);//emplace_back 的構造方式,不需寫尾部位址 |
# resize
更改 vector
中 element
個數
int main(){ | |
vector<int> v; | |
for (int i=1;i<10;i++) v.push_back(i); | |
v.resize(5);// 縮小容量到 5, 尾部多餘的 `element` 被刪除 | |
print(v); | |
v.resize(8,100);// 擴容到 8, 用 100 填值 | |
print(v); | |
v.resize(12);// 使用 0 填值 | |
print(v); | |
} |
輸出
1 2 3 4 5
1 2 3 4 5 100 100 100
1 2 3 4 5 100 100 100 0 0 0 0
# clear
刪除 vector
中的所有元素,如果有析構函式呼叫各自的析構函數,但是 clear 不刪除 vector
的容量,vector
的容量是自身佔用的記憶體值,不是其中包含的 element 的具體大小,為了效率考慮, vector
分配的記憶體值都是大於或等於已使用的記憶體值
例子
int main(){ | |
vector<pair<int,double>> vec;//vector 中嵌套 pair | |
vec.push_back(make_pair(1,1.0));// 常用的構造方式 | |
vec.emplace_back(1,2.0);//emplace_back 的構造方式 | |
cout<<vec.capacity()<<" "<<vec.size()<<endl; | |
vec.clear(); | |
cout<<vec.capacity()<<" "<<vec.size()<<endl; | |
} |
輸出
2 2
2 0//容量是不變的
對於即將再次被使用的容器,這樣做效率無疑更高,但對於即將丟棄的 vector
, 有沒有可以徹底善後的方法
# swap
該函數用於交換兩個 vector
容器的內容,那麼假如交換一個空 vector
呢?
using pa =pair<int,double>; | |
int main(){ | |
vector<pa> vec;//vector 中嵌套 pair | |
vec.push_back(make_pair(1,1.0));// 常用的構造方式 | |
vec.emplace_back(1,2.0);//emplace_back 的構造方式 | |
cout<<vec.capacity()<<" "<<vec.size()<<endl; | |
vec.clear(); | |
cout<<vec.capacity()<<" "<<vec.size()<<endl; | |
vector<pa> (vec).swap(vec); // 交換一個空容器 | |
cout<<vec.capacity()<<" "<<vec.size()<<endl; | |
} |
輸出
2 2 //初始容量
2 0 //調用clear後
0 0 //交換空容器後,整個vector 全部清空了
幾乎很少會在演算法題中使用,貿然使用可能會弄巧成拙