C++ 的 STL 常用標準庫
阿新 • • 發佈:2021-01-02
- 標頭檔案
- 類似於第三方包,或者說是系統的包
- # include<bits/stdc++.h> ,包含所有標頭檔案
// 向量容器
# include<vector>
// 字串型別
# include<string>
// 演算法庫
# include<algorithm>
// 棧
# include<stack>
// 佇列
# include<queue>
// 集合
# include<set>
// 對映
# include<map>
- 向量 vector
- 類似與陣列或者連結串列,儲存空間 “無限”
// vector
void vec_function() {
// vector<int> acc(100) 生成指定容量的容器
vector<int> vec;
for(int i=1; i<=20; i++) {
// 新增資料方式
vec.push_back(21-i);
}
// 插入字串,insert(位置下標,字串)
vec.insert(vec.begin(), 0);
// 通過迭代器遍歷,包括vector,queue,stack等同理
// 迭代器跟指標的作用類似
vector<int>::iterator ite_vec;
for(ite_vec=vec.begin(); ite_vec!=vec.end(); ite_vec++) {
cout<< *ite_vec<< " ";
}
// vector 也可以使用類似陣列一樣遍歷
int length = vec.size();
for(int i=0; i<length; i++) {
cout<< vec[i]<< " ";
}
// 清空容器內容
vec.clear();
}
vector
- 字串 string
- 字串型別,便於字串操作
// string
void str_function() {
string str = "abc";
// 末尾新增一個字元
str.push_back('2');
// 末尾拼接一個字串 str += "345" 同效果,但這種是生成了新的變數
str.append("345");
// 在指定位置插入資料
str.insert(3, "1");
cout<< str;
}
string
- 演算法庫 algorithm
- 提供常用的演算法支援,這裡值用了sort、nth_element
// sort、nth_element
void algorithm_function() {
int arr[] = {3, 1, 5, 2, 4, 10, 7, 9, 8, 6};
// 快速排序,平均時間複雜讀 O(n*logn)
// sort([a, b), Compare_function)
sort(arr+0, arr+10, com);
for(int i=0; i<10; i++) {
cout<< arr[i]<< " ";
}
// 模擬快速排序,平均時間複雜度 O(n)
// 即得出第n個位置的元素有序,其餘不一定
// nth_element(X.begin(), X.begin()+n, X.end())
nth_element(arr, arr+3, arr+10);
for(int i=0; i<10; i++) {
cout<< arr[i]<< " ";
}
}
algorithm
- 棧 stack
- 先進後出
// stack
void st_function() {
stack<int> st;
// 進棧,從末尾進
st.push(5);
// 取棧頂元素
int ele = st.top();
cout<< ele;
// 退棧,從末尾退
st.pop();
// 棧是否為空
st.empty();
// 棧內元素數量
st.size();
}
stack
- 佇列 queue
- 如同排隊,先進先出
// queue
void que_function() {
queue<int> que;
// 進佇列,從隊尾進
for(int i=0; i<5; i++) {
que.push(i);
}
// 取佇列隊首元素
int ele = que.front();
cout<< ele;
// 出佇列,從隊首出
que.pop();
// 佇列是否為空
que.empty();
// 隊內元素數量
que.size();
}
queue
- 優先佇列 priority_queue
- 自動排好序的佇列
// priority_queue
void pri_que_function() {
// greater 升序(預設), less 降序
priority_queue<int, vector<int>, less<int> > pri_que;
int num[10] = {5, 2, 3, 7, 9, 4, 10, 6, 1, 8};
for(int i=0; i<10; i++)
pri_que.push(num[i]);
while(!pri_que.empty()){
cout<< pri_que.top()<< " ";
pri_que.pop();
}
}
priority_queue
- 二元組 pair
- 二元資料對
// pair
void pair_function() {
// pair 初始賦值
pair<int, string> p1, p2(1, "Tom");
// 通過 make_pair 賦值
p1 = make_pair(1, "Jerry");
// 直接對比需要兩個分量都相等才能相等
cout<< bool(p2==p1)<< endl;
// pair 先比較第一個元素,再比較第二個元素
cout<< bool(p2 > p1)<< endl;
// 二元組是資料結構,也可抽象出陣列
pair<string, int> p[10];
for(int i=0; i<9; i++) {
// 可以分別賦值
p[i].second = i+175;
p[i].first = "Tom";
}
// 也可以使用 make_pair() 賦值
p[9] = make_pair("Tom", 185);
for(int i=0; i<10; i++) {
cout<< p[i].first<< " "<< p[i].second<< endl;
}
}
pair
- 對映 map
- 對映關係
// map
void map_function() {
map<string, int> m;
// 建立索引並新增
m["tom"] = 185;
// map可以使用 insert 新增 pair
pair<string, int> p("Jerry", 180);
m.insert(p);
cout<< m["Jerry"];
// 清除索引為 Jerry 的元素
m.erase("Jerry");
}
map
- 集合 set
// set
void set_function() {
set<int> s;
// 插入元素
int num[] = {1, 3, 2, 3, 2};
for(int i=0; i<5; i++) {
s.insert(num[i]);
}
// 刪除指定內容元素
s.erase(2);
// 要用迭代器讀取, 預設是從小到大
set<int>::iterator ss;
for(ss = s.begin(); ss != s.end(); ss++)
cout<< *ss<< ' ';
cout<< endl;
// 集合查詢元素
ss = s.find(6);
// 找到元素
if(ss != s.end()) {
cout<< *ss<< endl;
//若指標已經到末尾了,則說明找不到該元素
}else {
cout<< "Not find!\n";
}
}
set