STL
vector&deque
by 吳若喬
Index
what is stl?
- STL,全名Standard Template Library(標準模板庫)
- 包含container(容器)、algorithm(演算法)和iterator(迭代器)三大要素
- 特性為安全、公開、便利
例: vector/queue/deque/set/map/stack......等
what is stl?
- STL,全名Standard Template Library(標準模板庫)
- 包含container(容器)、algorithm(演算法)和iterator(迭代器)三大要素
- 特性為安全、公開、便利
例: vector/queue/deque/set/map/stack......等
vector
- 需匯入函式 #include <vector>
- 為連續記憶體空間
- 容量不夠會自動申請新的空間
- 僅可改變後端元素
翻譯: vector是容量無限大的陣列
vector
宣告
#include <iostream>
#include <vector>
//#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> v;
return 0;
}vector<變數型態> 變數名稱;
vector<int> number={1,2,3,4,5};
vector<char> ch={'a','b','c'};vector
宣告
#include <iostream>
#include <vector>
//#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> v;
return 0;
}vector<變數型態> 變數名稱;
vector<int> number={1,2,3,4,5};
vector<char> ch={'a','b','c'};std::cout << number;
>>Compile Errorvector
| 常用指令 | 功能 |
|---|---|
| v.at[1](超出邊界會提醒)/v[1] | =arr[1] |
| v.push_back(元素) | 從後放入元素 |
| v.pop_back() | 刪除最後一個元素 |
| v.size() | 回傳v的長度 |
| v.empty() |
回傳1代表此容器為空 回傳0代表此容器不為空 |
vector<int> v={1,2,3,4,5};int arr[1000]={1,2,3,4,5};vector
vector<int> v;
//empty
if(v.empty()) cout << "This container is empty!";
//也可寫成if(v.empty()==1)
else cout << "This container isn't empty!";
cout << endl;
//push&pop&size
for(int i=0;i<10;i++){
v.push_back(i);
}
v.pop_back();
int len=v.size();
for(int i=0;i<len;i++){
cout << v[i];
}
//run result
//This container is empty!
//012345678vector
| 指令 | 功能 |
|---|---|
| v.insert(索引值,(數量),插入元素) | 插入元素(可為單個或多個) |
| v.erase(迭代器頭,(迭代器尾)) | 刪除範圍元素(可為單一元素) |
| v.clear() | 清除所有元素 |
| v.capacity() | 回傳容量 |
| v.reserve(數字) (沒什麼用) | 預留空間 |
vector<int> v={1,2,3,4,5};int arr[1000]={1,2,3,4,5};vector
| 指令 | 功能 |
|---|---|
| v.begin() | 回傳v向量的迭代器頭 |
| v.end() | 回傳v向量的迭代器尾 |
vector<int> v={1,2,3,4,5};int arr[1000]={1,2,3,4,5};|
|
'H' (0) | 'e' (1) |
'l' (2) |
'l' (3) |
'o' (4) |
'\0' |
|---|
arr.begin()
arr.end()
vector
迭代器複習(String單元的簡報)
|
|
'H' (0) | 'e' (1) |
'l' (2) |
'l' (3) |
'o' (4) |
'\0' |
|---|
假設一向量名為arr,此為它的內容。
arr.begin()
arr.end()
arr.rend()
arr.rbegin()
|
|
'H' (0) | 'e' (1) |
'l' (2) |
'l' (3) |
'o' (4) |
'\0' |
|---|
假設一向量名為arr,此為它的內容。
arr.begin()
arr.end()
arr.rend()
arr.rbegin()
**有頭無尾**
vector
迭代器複習(String單元的簡報)
vector
//insert&erase
vector<int> v1={5,6,7,8,9};
vector<int> v2={1,2,3,4,5};
v2.insert(v2.begin()+5,6);
for(int i=0,len=v2.size();i<len;i++){
cout << v2[i];
}
cout << endl;
//迴圈輔助
for(int i=0,len=v1.size();i<len;i++){
v2.insert(v2.begin()+6+i,v1[i]);
}
for(int i=0,len=v2.size();i<len;i++){
cout << v2[i];
}
cout << endl;
//clear
v2.clear();
if(v2.empty()) cout << "v2 is clear";vector
vector<int> v1={5,6,7,8,9};
vector<int> v2={1,2,3,4,5};
cout << "size: " << v1.size() << " " << v2.size() << endl;
cout << "capacity: " << v1.capacity() << " " << v2.capacity() << endl;
v2.insert(v2.begin()+1,0);
cout << "v2 after insert number" << endl;
cout << "size: " << v1.size() << " " << v2.size() << endl;
cout << "capacity: " << v1.capacity() << " " << v2.capacity() << endl;
//size: 5 5
//capacity: 5 5
//v2 after insert number
//size: 5 6
//capacity: 5 10The difference between size and capacity
vector
vector<int> v1={5,6,7,8,9};
vector<int> v2={1,2,3,4,5};
cout << "size: " << v1.size() << " " << v2.size() << endl;
cout << "capacity: " << v1.capacity() << " " << v2.capacity() << endl;
v2.insert(v2.begin()+1,0);
cout << "v2 after insert number" << endl;
cout << "size: " << v1.size() << " " << v2.size() << endl;
cout << "capacity: " << v1.capacity() << " " << v2.capacity() << endl;
//size: 5 5
//capacity: 5 5
//v2 after insert number
//size: 5 6
//capacity: 5 10The difference between size and capacity
當vector的空間超過預設值,容量會主動變成1.5或2倍。
vector
| 指令 | 功能 |
|---|---|
| v.front() | 回傳第一個值 |
| v.back() | 回傳最後一個值 |
| v.assign(數量,值) or v.assign(其他迭代器頭,其他迭代器尾) |
將v初始化並設定成等同於數量的值 or 將v初始化並設定成其他迭代器的一段範圍(或全部) |
| v.swap(其他向量) | 交換 |
int arr[1000]={1,2,3,4,5};vector<int> v={1,2,3,4,5};vector
vector<int> v1={5,6,7,8,9};
vector<int> v2={1,2,3,4,5};
cout << "first: " << v1.front() << " " << v2.front();
cout << endl;
cout << "back: " << v1.back() << " " << v2.back();
cout << endl;
v1.assign(3,6);
v2.assign(v1.begin()+1,v1.begin()+3);
v1.swap(v2);
for(int i=0,len=v1.size();i<len;i++){
cout << v1[i];
}
cout << endl;
for(int i=0,len=v2.size();i<len;i++){
cout << v2[i];
}
//first: 5 1
//back: 9 5
//66
//666vector
其他範例
char arr[11]="chikichiki";
vector<char>k(arr,arr+10);
k.pop_back();//刪除最後的i
k.push_back('i');//加入i到最後
k.erase(k.begin()+5,k.end());//刪除'chiki'
k.insert(k.begin()+3,'~');//插入'~'
int length=k.size();
for(int i=0;i<k.size();i++){
cout << k[i];
}
//chi~kivector
iterator用法
vector<int> v1={5,6,7,8,9};
vector<int> v2={1,2,3,4,5};
cout << "first: " << v1.front() << " " << v2.front();
cout << endl;
cout << "back: " << v1.back() << " " << v2.back();
cout << endl;
v1.assign(3,6);
v2.assign(v1.begin()+1,v1.begin()+3);
v1.swap(v2);
/*for(int i=0,len=v1.size();i<len;i++){
cout << v1[i];
}*/
for(vector<int>::iterator it=v1.begin();it!=v1.end();++it){ //++要在前面
cout << *it;
}
cout << endl;
for(auto it=v2.begin();it!=v2.end();++it){
cout << *it;
}
cout << endl;
for(auto &it:v2){
cout << it;
}
//first: 5 1
//back: 9 5
//66
//666
//666deque
- 需匯入函式 #include <deque>
- 全名為double ended-queue
- 可以主動調整容量大小(沒有capacity指令確認變化)
- 擁有前後兩端都可進行操控的特性
deque
宣告
#include <iostream>
#include <deque>
//#include <bits/stdc++.h>
using namespace std;
int main()
{
deque<int> d;
return 0;
}deque
| 常用指令 | 功能 |
|---|---|
| d[1] | =arr[1] |
| d.push_back/front(元素) | 從後/前放入元素 |
| d.pop_back/front() | 刪除最後/最前一個元素 |
| d.size() | 回傳d的長度 |
| d.empty() |
回傳1代表此容器為空 回傳0代表此容器不為空 |
deque<int> d={1,2,3,4,5};int arr[1000]={1,2,3,4,5};deque
deque<int> d={3,4,5};
d.push_front(2);
d.push_front(1);
d.push_back(6);
d.push_back(7);
d.pop_front();
d.pop_back();
for(int i=0,len=d.size();i<len;i++){
cout << d[i];
}
cout << endl;
if(!d.empty()) cout << "d isn't an empty container";deque
deque<int> d={1,2,3,4,5};int arr[1000]={1,2,3,4,5};| 指令 | 功能 |
|---|---|
| d.insert(索引值,(數量),插入元素) | 插入元素(可為單個或多個) |
| d.erase(迭代器頭,(迭代器尾)) | 刪除範圍元素(可為單一元素) |
| d.clear() | 清除所有元素 |
deque
| 指令 | 功能 |
|---|---|
| d.begin()/cbegin() | 回傳d容器的迭代器頭 |
| d.end()/d.cend() | 回傳d容器的迭代器尾 |
| d.rbegin()/crbegin() | 回傳d容器的反向迭代器頭 |
| d.rend()/crend() | 回傳d容器的反向迭代器尾 |
c為const
通常用於宣告常數或𝝅等不再改變的數
在此目的為僅回傳不修改
deque
|
|
'H' (0) | 'e' (1) |
'l' (2) |
'l' (3) |
'o' (4) |
'\0' |
|---|
arr.begin()
arr.end()
arr.rend()
arr.rbegin()
deque
deque<int> d1={5,6,7,8,9};
deque<int> d2={1,2,3,4,5};
cout << "first: " << d1.front() << " " << d2.front();
cout << endl;
cout << "back: " << d1.back() << " " << d2.back();
cout << endl;
for(deque<int>::iterator it=d1.begin();it!=d1.end();++it){ //++要在前面
cout << *it;
}
cout << endl;
for(auto it=d2.begin();it!=d2.end();++it){
cout << *it;
}
cout << endl;
for(auto &it:d2){
cout << it;
}
//first: 5 1
//back: 9 5
//56789
//12345
//12345source
stl_vec_deq
By Wu Phoebe
stl_vec_deq
- 118