1. 程式人生 > 實用技巧 >C++ 的 STL 常用標準庫

C++ 的 STL 常用標準庫

  • 標頭檔案
    • 類似於第三方包,或者說是系統的包
    • # 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