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
Made with Slides.com