STL實作

吳若喬

vector

deque & vector

使用vector實作一個程式將「台北市」、「新北市」、「台中市」、「台南市」與「高雄市」城市名稱依序轉成0到4的數字,通常用於將地名轉成數字,建立城市之間的圖形資料結構用,因為城市名稱不適合用於建立圖形資料結構,需將城市名稱轉換成數字,相同的城市名稱要對應相同數字,不同城市名稱對應不同數字。使用二維整數陣列就可以記錄圖形是否有邊相連,建立圖形資料結構。

  • 宣告vector
  • 將文字轉為數字
  • 將索引值對應城市放入vector容器

deque & vector

deque & vector
//宣告
string s[5]={"台北市","新北市","台中市","台南市","高雄市"};
vector<string> v;
vector<string>::iterator it;
int getindex(string);
//宣告
string s[5]={"台北市","新北市","台中市","台南市","高雄市"};
vector<string> v;
vector<string>::iterator it;
int getindex(string);
//宣告
string s[5]={"台北市","新北市","台中市","台南市","高雄市"};
vector<string> v;
vector<string>::iterator it;
int getindex(string);

deque & vector

deque & vector
int getindex(string city){
  it=find(v.begin(),v.end(),city);  //在vector裡尋找該城市(確認是否出現過)
  if (it < v.end()) return it-v.begin(); //出現過就直接回傳當初儲存的位置
  else if (it == v.end()){  //沒找到(即第一次加入vector)
    v.push_back(city);      //將city加入vector
    return v.size()-1;      //回傳(索引值)
  } 
}

將城市轉為索引值後回傳

因此用int 函式

deque & vector

deque & vector

看一下是否符合:

for(int i=0;i<5;i++){
	int index=getindex(s[i]);
	cout << s[i] << " " << index <<endl;
}
for(int i=0;i<5;i++){
	cout << i <<" " << v[i] <<endl;
}	

deque & vector

deque & vector

如果存在同樣城市?

string s[6]={"台北市","新北市","台中市","台南市","高雄市","新北市"};
for(int i=0;i<6;i++){
	int index=getindex(s[i]);
	cout << s[i] << " " << index <<endl;
}
for(int i=0;i<6;i++){
	cout << i <<" " << v[i] <<endl;
}

deque

deque & vector

實作一個程式將以下無向圖,儲存到deque陣列中,未來在圖形走訪單元就可以使用此deque陣列,進行圖形的深度優先走訪或廣度優先走訪。若輸入的點是字串名稱也沒關係,可以使用字串轉換成數字,再建立圖形。

  • 宣告deque
  • 建立無向圖放進deque
  • 通常為bfs和dfs的起手

deque

deque & vector
deque<int> d[4];
d[0] d[0][0] d[0][1]
d[1] d[1][0] d[1][1]
d[2] d[2][0] d[2][1]
d[3] d[3][0] d[3][1]
d[0] d[0][0] d[0][1]
d[1] d[1][0] d[1][1]
d[2] d[2][0] d[2][1]
d[3] d[3][0] d[3][1]

deque

deque & vector
0 1
0 2
1 2
1 3

0

1

3

2

deque

deque & vector
int x,y;
for(int i=0;i<4;i++){
	cin >> x >> y;      
	F[x].push_back(y);
	F[y].push_back(x);
}

deque

deque & vector
d[0] 1 2
d[1] 0 2 3
d[2] 0 1
d[3] 1
for(int i=0;i<4;i++){
	cout << i << "=>";      
	for(int j=0;j<d[i].size();j++){
		cout << d[i][j] << " ";	
	}
	cout << endl;     
} 

stack

stack & queue

stack

stack & queue
..p..p.p...q.q.

p、q配對 : 

stack

stack & queue
..p..p.p...q.q.

p、q配對 : 兩對

stack

stack & queue
..p..p.p...q.q.

stack

stack & queue
..p..p.p...q.q.

stack

stack & queue
..p..p.p...q.q.

stack

stack & queue
..p..p.p...q.q.

stack

stack & queue
..p..p.p...q.q.

stack

stack & queue
..p..p.p...q.q.

stack

stack & queue
..p..p.p...q.q.

stack

stack & queue
..p..p.p...q.q.

stack

stack & queue
#include <bits/stdc++.h>
using namespace std;
stack<char> p;
char s[1000000000];
int main() {
  long long int n,pair;
  cin >> n;
  for(int i=0;i<n;i++){
    cin >> s;
    pair=0;
    while(!p.empty()) p.pop();
    int j=0;
    while(s[j] != '\0'){
      if(s[j]=='p') {
        p.push('p');
      }        
      if(s[j]=='q') {
        if (p.size()>0){
          p.pop();
          pair++;
        }
      }
      j++;            
    }
    cout << pair << endl;
  }
}

map

set & map
使用map儲存a~g的ASCII碼,並使用指標寫法將其印出。

map

set & map

map

set & map
vector<string> one,up; //一個紀錄指出現一次,一個儲存兩次以上
map<string,int> eng;
Made with Slides.com