C++ STL 容器
STL 是什麼?
standard template library
什麼是容器?
為什麼要用STL?
概述STL容器"慣用詞"
-
push,insert:加入元素
-
pop,erase,remove:刪除元素
-
begin,end:該容器頭/尾的位址
-
front,back:該容器頭/尾的元素
-
size:該容器大小
-
empty:該容器是否為空
順序容器
sequence containers
一個"序列" 其資料具有"順序性"
vector
簡單來說,
就是內建的動態配置的陣列
順序容器入門款:
語法:
#include <iostream>
#include <vector>
using namespace std;
vector<int> my_vector;
int main(){
my_vector.push_back(1);
//在後面插入1
//目前容器為:1
my_vector.push_back(2);
//在後面插入2
//目前容器為:1 2
my_vector.push_back(3);
//在後面插入3
//目前容器為:1 2 3
cout<<my_vector.front();
//輸出"最前面的元素"......1
//
cout<<'\n';
//
cout<<my_vector.back();
//輸出"最後面的元素"......3
//
cout<<'\n';
//
cout<<my_vector.size();
//輸出"容器長度"......3
//
cout<<'\n';
//
//用迴圈依序輸出所有容器內的值:
int sizea=my_vector.size();
for (int i=0;i<sizea;i++){
cout<<my_vector[i]<<' ';
//輸出容器的第i項
}
//
cout<<'\n';
//
my_vector.pop_back();
//移除最後面
sizea=my_vector.size();
for (int i=0;i<sizea;i++){
cout<<my_vector[i]<<' ';
//輸出容器的第i項
}
//目前容器為:1 2
//
cout<<'\n';
//
my_vector.pop_back();
//移除最後面
sizea=my_vector.size();
for (int i=0;i<sizea;i++){
cout<<my_vector[i]<<' ';
//輸出容器的第i項
}
//目前容器為:1
//
cout<<'\n';
//
my_vector.pop_back();
//移除最後面
sizea=my_vector.size();
for (int i=0;i<sizea;i++){
cout<<my_vector[i]<<' ';
//輸出容器的第i項
}
//目前容器為:
if (my_vector.empty()){
cout<<"It's empty now!";
}
//檢查容器是否為空
return 0;
}
-
宣告: vector<要處存的資料型別> 容器名;
-
在後面插入: 容器名.push_back(要插入的值);
-
最前面的值: 容器名.front();
-
最後面的值: 容器名.back();
-
容器大小: 容器名.size();
-
取容器內的值: 容器名[第幾項];
-
刪除最後面的值: 容器名.pop_back(要插入的值);
-
檢查容器是否為空: 容器名.empty();
#include<iostream>
#include <vector>
using namespace std;
vector<int> my_vector;
int main()
{
for (int i=1;i<=10;i++){
my_vector.push_back(i);
}
//目前容器為:1 2 3 4 5 6 7 8 9 10
//用迭代器(位址)來跑陣列:
for (vector<int>::iterator i=my_vector.begin();i!=my_vector.end();i++){
//i初始為my_vector的位址,每跑一圈,i前往容器的下一個位址
cout<<*i<<' ';
//輸出在i位址的值
}
//
cout<<'\n';
//
my_vector.erase(my_vector.begin());
//刪除最前面的元素
//目前容器為:2 3 4 5 6 7 8 9 10
for (vector<int>::iterator i=my_vector.begin();i!=my_vector.end();i++){
//i初始為my_vector的位址,每跑一圈,i前往容器的下一個位址
cout<<*i<<' ';
//輸出在i位址的值
}
//
cout<<'\n';
//
vector<int>::iterator it=my_vector.begin();
//宣告一個迭代器變數為my_vector最前面的位址
it++;
//i前往容器的下一個位址
//此時i在容器的第2個位址
it++;
//i前往容器的下一個位址
//此時i在容器的第3個位址
my_vector.insert(it,15);
//在第三個位址前插入15
//目前容器為:2 3 15 4 5 6 7 8 9 10
for (vector<int>::iterator i=my_vector.begin();i!=my_vector.end();i++){
//i初始為my_vector的位址,每跑一圈,i前往容器的下一個位址
cout<<*i<<' ';
//輸出在i位址的值
}
my_vector.clear();
//淨空容器
//目前容器為:
for (vector<int>::iterator i=my_vector.begin();i!=my_vector.end();i++){
//i初始為my_vector的位址,每跑一圈,i前往容器的下一個位址
cout<<*i<<' ';
//輸出在i位址的值
}
//
cout<<'\n';
//
return 0;
}
-
宣告迭代器變數(位址):vector<要處存的資料型別>::iterator 迭代器變數名;
-
迭代器"前往容器的下個位址": 迭代器變數名++;
-
反之,迭代器"前往容器的上個位址": 迭代器變數名--;
-
最前面的迭代器(位址):容器名.begin();
-
最前面的迭代器(位址):容器名.end();
-
在某迭代器(位址)前插入元素:容器名.insert(插入迭代器(位址),要插入的值);
-
刪除某個元素: 容器名.erase(該迭代器(位址));
-
刪除容器內所有元素: 容器名.clear();
啊~~講完最硬的部分了呢!
喝口水休息一下吧
list
和vector的差別:為不連續記憶體
1 | 2 | 3 | 4 | 5 | 6 |
---|
以指標作為上一個和下一個之間的聯繫
3 | 2 | 4 | 1 |
---|
指標連結
vector
list
沒有固定起頭位址,支援元素之間直接插入
deque
和vector的差別:為雙向不連續區段記憶體
以指標連結區段和區段之間,沒有固定起頭位址,支援雙向直接插入
1 | 2 | 3 | 4 | 5 | 6 |
---|
vector
deque
1 | 2 | 3 | 4 | 5 | 6 |
---|
指標連結
vector,list,deque之間的比較

三者使用策略
vector,list,和deque
還有很多實用的功能喔,
但礙時間因素,
留給學員們自行探索囉~~
GOOGLE搜尋:C++ reference
接配器
Adapter
stack
stack常用語法
- stack.push(n):將n丟入stack尾端
- stack.pop():將stack尾端的值移除
- stack.top():回傳stack尾端的值
#include<iostream>
#include<stack>
using namespace std;
int main()
{
int n = 10;
stack <int> sta;
for(int i = 0; i < n; i++){
//把i丟入stack最上方
sta.push(i);
cout << i;
}
cout << "\n";
for(int i = 0; i < n; i++){
//將stack最上面的值輸出
cout << sta.top();
//將stack最上面的值移除
sta.pop();
}
return 0;
}
queue常用語法
- queue.push(n):將n丟入queue
- queue.pop():將queue第一個值移除
- queue.back():回傳queue最後一個值
- queue.front():回傳queue第一個值
#include<iostream>
#include<queue>
using namespace std;
int main()
{
int n = 10;
queue <int> que;
for(int i = 0; i < n; i++){
//把i丟入queue最上方
que.push(i);
cout << i;
}
cout << "\n";
for(int i = 0; i < n; i++){
//將queue最下面的值輸出
cout << que.front();
//將queue最下面的值移除
que.pop();
}
return 0;
}
例題
水管
deque例題
有一條管子,可在其前後塞數字,求塞完所有數字之後,管子從頭到尾的內容。
第一行輸入n:操作數目,接下來n行每行輸入cmd:操作種類,x:插入數字,當cmd=1,在管子前頭塞入x,當cmd=2,再管子後方塞入x,
請依序輸出管子的內容
插隊
list例題
有n個人在排隊,有m個沒品的人想插隊,想插隊的人會選定一個位置插入隊伍,請依序輸出隊伍最後的人們
第一行輸入n:排隊人數,m:沒品人數,接下來m行每行輸入pos:插隊位置,x:插隊的人
請依序輸出管子的內容
關聯容器
associative containers
C++ STL 容器
By jeffreylin0909
C++ STL 容器
- 187