1. 程式人生 > 其它 >C++ 常用STL容器

C++ 常用STL容器

內容來源於AcWing yls的部落格

vector(變長陣列),倍增的思想,支援比較運算(按字典序)
    定義::
        vector <int> a; 定義:一個vector陣列a
        vector <int> a(10); 定義:一個長度為10的vector陣列a
        vector <int> a(10,3); 定義:一個長度為10的vector陣列a,並且所有元素都為3
    常用函式::
        size(); 返回元素個數
        empty(); 返回是否是空
        clear(); 清空
        front(); 返回vector的第一個數
        back(); 返回vector的最後一個數
        push_back(); 向vector的最後插入一個數
        pop_back(); 把vector的最後一個數刪掉
        begin(); vector的第0個數
        end(); vector的最後一個的數的後面一個數
    倍增的思想:
        系統為某一程式分配空間是,所需時間,與空間大小無關,與申請次數有關
    遍歷方法
        假設有個vector <int> a;
        第一種:
            for(int i = 0;i < a.size();i ++) cout<<a[i]<<" ";
        第二種:
            for(vector <int>::iterator i = a.begin();i != a.end();i ++) cout<<*i<<" ";  vector <int>::iterator可以寫為auto
        第三種:
            for(auto  x : a) cout<<x<<" ";

pair,支援比較運算,以first為第一關鍵字,以second為第二關鍵字(按字典序)
    定義::
        pair <型別,型別> 變數名;    兩個型別可以不同
    初始化方式:
        假設有個pair <int,string> p;
        第一種:
            p = make_pair(10,"abc");
        第二種:
            p = {10,"abc");
    常用函式::
        first(); 第一個元素
        second(); 第二個元素

string(字串)
    常用函式::
        substr(); 返回每一個子串
        c_str(); 返回這個string對應的字元陣列的頭指標
        size(); 返回字母個數
        length(); 返回字母個數
        empty(); 返回字串是否為空
        clear(); 把字串清空
queue(佇列)
    定義::
        queue <型別> 變數名;
    常用函式::
        size(); 這個佇列的長度
        empty(); 返回這個佇列是否為空
        push(); 往隊尾插入一個元素
        front(); 返回隊頭元素
        back(); 返回隊尾元素
        pop(); 把隊頭彈出
        注意:佇列沒有clear函式!!!
    清空:
        變數名 = queue <int> ();
priority_queue(優先佇列,堆)
    注意:預設是大根堆!!!
    定義::
        大根堆:priority_queue <型別> 變數名;
        小根堆:priority_queue <型別,vecotr <型別>,greater <型別>> 變數名
    常用函式:
        size(); 這個堆的長度
        empty(); 返回這個堆是否為空
        push();往堆裡插入一個元素
        top(); 返回堆頂元素
        pop(); 彈出堆頂元素
        注意:堆沒有clear函式!!!

stack(棧)
    常用函式:
        size(); 這個棧的長度
        empty(); 返回這個棧是否為空
        push(); 向棧頂插入一個元素
        top(); 返回棧頂元素
        pop(); 彈出棧頂元素

deque(雙端佇列)
    常用函式:
        size(); 這個雙端佇列的長度
        empty(); 返回這個雙端佇列是否為空
        clear(); 清空這個雙端佇列
        front(); 返回第一個元素
        back(); 返回最後一個元素
        push_back(); 向最後插入一個元素
        pop_back(); 彈出最後一個元素
        push_front(); 向隊首插入一個元素
        pop_front(); 彈出第一個元素
        begin(); 雙端佇列的第0個數
        end(); 雙端佇列的最後一個的數的後面一個數

set,map,multiset,multimap 基於平衡二叉樹(紅黑樹),動態維護有序序列
    set/multiset
        注意:set不允許元素重複,如果有重複就會被忽略,但multiset允許!!!
        常用函式:
            size(); 返回元素個數
            empty(); 返回set是否是空的
            clear(); 清空
            begin(); 第0個數,支援++或--,返回前驅和後繼
            end(); 最後一個的數的後面一個數,支援++或--,返回前驅和後繼
            insert(); 插入一個數
            find(); 查詢一個數
            count(); 返回某一個數的個數
            erase();
                (1)輸入是一個數x,刪除所有x    O(k + log n)
                (2)輸入一個迭代器,刪除這個迭代器
            lower_bound(x); 返回大於等於x的最小的數的迭代器
            upper_bound(x); 返回大於x的最小的數的迭代器
    map/multimap
        常用函式:
            insert(); 插入一個數,插入的數是一個pair
            erase(); 
                (1)輸入是pair
                (2)輸入一個迭代器,刪除這個迭代器
            find(); 查詢一個數
            lower_bound(x); 返回大於等於x的最小的數的迭代器
            upper_bound(x); 返回大於x的最小的數的迭代器

unordered_set,unordered_map,unordered_muliset,unordered_multimap 基於雜湊表
    和上面類似,增刪改查的時間複雜度是O(1)
    不支援lower_bound()和upper_bound()

bitset 壓位
    定義:
        bitset <個數> 變數名;
    支援:
        ~,&,|,^
        >>,<<
        ==,!=
        []
    常用函式:
        count(); 返回某一個數的個數
        any(); 判斷是否至少有一個1
        none(); 判斷是否全為0
        set(); 把所有位置賦值為1
        set(k,v); 將第k位變成v
        reset(); 把所有位變成0
        flip(); 把所有位取反,等價於~
        flip(k); 把第k位取反。