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 Error

vector

常用指令 功能
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!
//012345678

vector

指令 功能
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 10

The 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 10

The 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
//666

vector

                        其他範例

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~ki

vector

                        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
//666

deque

  • 需匯入函式 #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
//12345

source

stl_vec_deq

By Wu Phoebe

stl_vec_deq

  • 118