日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

又爱又恨的STL

發(fā)布時間:2024/1/17 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 又爱又恨的STL 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

又愛又恨的STL:

文章目錄

  • 又愛又恨的STL:
  • STL(標準模板庫)
    • 容器:
      • vector-變長數(shù)組
      • set-內(nèi)部自動有序且不含重復元素
      • string-字符串
      • map-鍵值對(key-value)
      • queue-隊列
      • priority_quque-優(yōu)先隊列(自動排序的隊列)
      • stack-棧
      • pair-對
    • 算法
      • sort()與stable_sort()
      • random_shuffle()
      • lower_bound()與upper_bound()
      • next_permutation()
      • unique()
    • 迭代器
      • iterator(默認容器為vector,名稱為v)
      • reverse_iterator
    • 參考資料

STL(標準模板庫)

STL組成的六部分:算法容器、迭代適配器、迭代器、仿函數(shù)、空間配制器。

容器:

  • 簡單容器:pair
  • 序列容器:vector,list,forward_list(單向鏈表),deque(雙端隊列),arry(C++14)
  • 容器適配器:queue,priority_queue,stack
  • 關聯(lián)容器:set,multiset,map,multimap,(unordered_set,unordered_multiset,unordered_map,unordered_multimap)
  • .其他容器:bitset, valarry.
  • vector-變長數(shù)組

    • 底層實現(xiàn):數(shù)組

    • 頭文件:#include <vector>

    • 定義

      • vector<typename> name; //可以看成一維數(shù)組
      • vector<vector<typename> > name; // 可以看成二維數(shù)組
    • 定義vector數(shù)組:

      • vector<typename> Arrayname[arrySize];//可以看成二維數(shù)組,但不同于vector<vector<typename> > 的是,一維的長度已經(jīng)固定了。
    • 訪問:

    • 通過下標訪問:name[index];
    • 通過迭代器(iterator)訪問,這里用循環(huán)來解釋: for(vector<typename>::iterator it = name.begin(); it!=name .end();it++) { cout<<*it<<end;;}//此時*it是vector里的元素。或 for(auto it:name){cout<<it<<" "}//基于范圍的for循環(huán)。
    • 常用函數(shù):

      函數(shù)名push_back()pop_back()size()clear()insert(it,x)
      功能尾插尾刪長度清空向迭代器it處插入元素x
      時間復雜度O(1)O(1)O(1)O(n)O(n)
    • erase()

      • erase(it) 刪除目前迭代器指向 的元素
      • erase(first,last) 刪除區(qū)間內(nèi)的元素PS(first與last都是迭代器)
      • 時間復雜度O(n)

    set-內(nèi)部自動有序且不含重復元素

    • 底層實現(xiàn):紅黑樹
    • 頭文件:#include<set>
    • 定義set:set<typename >name
    • 訪問:只通過迭代器來訪問。 for(set<typename>::iterator it = name.begin(); it!=name .end();it++) { cout<<*it<<end;;}或 for(auto it : name){cout<<it<<" "}//此時*it是set里的元素。
    • 常用函數(shù):
    函數(shù)名insert()find(value)size()clear()
    功能插入返回對應值為value的迭代器容器長度清空容器
    時間復雜度O(logN)O(logN)O(1)O(N)

    name.erase(it)刪除當前迭代器it指向的值。時間復雜度O(1)

    name.erase(value)刪除value這個值。時間復雜度O(logN)

    name.erase(first,last)刪除區(qū)間[first,last)內(nèi)的元素。時間復雜度O(last-first).first與last都為迭代器

    string-字符串

    • string 讀入可以用cin,輸出可以用cout,也可以用printf("%s",ss.c_str());
    • 頭文件:#include<string>
    • 定義:
      • 一維:string str;
      • 二維:string str[maxx];
    • 訪問:
      • 通過下標訪問
      • 通過迭代器訪問
    • 常用技巧
    clear()+===、!=、<、<=、>、>=length()/size()substr(pow,len)
    清空拼接賦值通過字典序來比較大小長度返回從pos號位開始,長度為len的子串
    O(1)O(1)O(len)
    • insert()
      • insert(pos,string) 在pos位置插入string
      • insert(it1,it2,it3) 在it1位置上插入[it2,it3)區(qū)間的字符串。其中it1,it2,it3均為迭代器
    • erase()
      • erase(it) 刪除it指向的字符
      • erase(first,last) 刪除區(qū)間[first,last)所有的元素
      • erase(pos,len) 刪除從pos開始的len長度的字符個數(shù)
    • find()
      • find(str2) 找到子串第一次出現(xiàn)的位置,若不是,返回string::npos ^ 1
      • find(str2,pos) 從str的pos開始開始匹配str2
      • 時間復雜度為:O(nm)。其中n、m分別是str和ser2的長度
    • repalce()
      • replace(pos,len,str2) 把str從pos號位開始,長度位len的子串替換為str2
      • replace(it1,it2,str2) 把str的迭代器[it1,it2)范圍的子串替換為str2
      • 時間復雜度為:O(str.size())。

    map-鍵值對(key-value)

    • 底層實現(xiàn):紅黑樹

    • 頭文件:#include<map>

    • 定義:map<typename1,typename2 > name

    • 訪問:

      • 通過下標訪問

      • 通過迭代器訪問

        for(map<typename1, typename2>::iterator it = name.begin(); it != name.end(); it++{it->first; //訪問鍵it->second;//訪問值 }
    • 常用函數(shù):

    函數(shù)名find(key)size()clear()
    功能返回key的映射的迭代器長度清除
    時間復雜度O(logN)O(1)O(N)
    • erase()
      • erase(it) 刪除it指向的元素。O(1)
      • erase(key) 刪除鍵中為key的值。O(logN)
      • erase(first,last) 刪除[first,last)區(qū)間元素。O(last-first)

    queue-隊列

    • 底層實現(xiàn):用list或deque(默認)實現(xiàn),封閉頭部即可
    • 頭文件:#include<queue>
    • 定義:queue<typename> name
    • 訪問:
      • front()隊首
      • back() 隊尾
    • 常用函數(shù)
    函數(shù)名push()front()/back()pop()empty()size()
    功能入隊取隊頭/隊尾隊頭出隊隊列判空判斷隊中的元素
    時間復雜度O(1)O(1)O(1)O(1)O(1)

    priority_quque-優(yōu)先隊列(自動排序的隊列)

    • 底層實現(xiàn):以vector為底層容器,為處理規(guī)則來管理底層容器
    • 默認為數(shù)字大的優(yōu)先級高
    • 頭文件:#include<queue>
    • 定義:priority_queue< typename > name;
    • 訪問: name.top()
    • 常用函數(shù)
    函數(shù)名push()top()pop()empty()size()
    功能入隊取隊頭隊頭出隊隊列判空判斷隊中的元素
    時間復雜度O(1)O(1)O(1)O(1)O(1)
    • 優(yōu)先級設置

      • 基本數(shù)據(jù)類型

        priority_queue<int > q; priority_queue<int,vector<int>,less<int> > q;//數(shù)字大的優(yōu)先級大 priority_queue<int,vector<int>,greate<int> > q;//數(shù)字小的優(yōu)先級大 注:vector<int>是來承載底層heap的容器。less<int>與greater<int>是對第一個參數(shù)的比較類。
      • 結(jié)構體

        • 將重載放到結(jié)構體內(nèi)

          struct student{string s_id;int s_grade;friend bool operator < (student s1,student s2){return s1.s_grade < s2.s_grade;//s_grade大的優(yōu)先級高} } priority_queue<student> q;
        • 將重載放到結(jié)構體外

          struct cmp{bool operator (const student &s1,const student &s2){return s1.s_grade > s2.s_grade;} } priority_queue<student,vector<student>, cmp> q;

    stack-棧

    • 底層實現(xiàn):用list、deuqe(默認)或vector實現(xiàn),封閉頭部即可

    • 頭文件:#include<stack>

    • 定義:stack<typename > name;

    • 訪問:使用top()來訪問棧頂元素

    • 常用函數(shù):

      函數(shù)名push()top()pop()empty()size()
      功能入棧取棧頂元素出棧判斷棧是否為空當前棧的長度
      時間復雜度O(1)O(1)O(1)O(1)O(1)

    pair-對

    • 頭文件:#include<utility>
    • 定義:pair<typename1,tepename2 > name
    • 訪問:name.first/name.second 分別表示第一個元素和第二個元素。
    • 常用技巧:
      • 插入
        • 用函數(shù)插入:make_pair(name.first,name.sceond);
        • 直接插入:cin>>name.first>>name.sceond
      • 比較操作符^2 :比較規(guī)則是先比較first,first相同時再比較second。

    算法

    sort()與stable_sort()

    • 這里多說一下,數(shù)組排序就是從你指定的地址開始,在你給定的長度之前排序。但是string有點不一樣,如果你像用數(shù)組那么使用,那便是你對string數(shù)組進行排序。當你要對單個的string進行排序時用法為:sort(name[i].begin(),name[i].end())

    • sort():默認升序重新排序指定訪問的元素。可重載

      • 用法:

        • sort(v.begin(),v.end(),less<int>())//升序

        • sort(v.begin(),v.end(),greate<int>())//降序

        • bool cmp(int a,int b){return a > b; } sort(v.begin(),v.end(),cmp);
      • 不穩(wěn)定的排序

      • 時間復雜度O(NlogN);

    • stable_sort():與sort類似,不過保留相等元素之間的順序關系。可重載

      • 穩(wěn)定的排序
      • 時間復雜度:O(Nlog2(N))

    random_shuffle()

    • 對指定范圍被的元素隨機排序
    • 時間復雜度O(1);

    lower_bound()與upper_bound()

    • 二分查找函數(shù),返回的是迭代器
    • lower_bound():
      • 用法:lower_bound(v.begin(),v.end(),20)-v.begin();//在vector里面查找第一個大于或等于20的下標
      • 返回第一個大于或等于查找的數(shù)的地址。
    • upper_bound():
      • 用法:upper_bound(v.begin(),v.end(),20)-v.begin();//在vector里面查找第一個大于20的下標
      • 返回第一個大于查找的數(shù)的地址。

    next_permutation()

    • 全排列函數(shù)
    • 用法
    int x[3] = {3,2,1};sort(a,a+3);do {cout<<x[0]<<" "<<x[1]<<" "<<x[2]<<endl;}while(next_permutation(x,x+3));
    • 時間復雜度:O(N!)

    unique()

    • 有序數(shù)組去重
    • 用法:unique(a,a+n)-a; 返回的是數(shù)組去重后的長度。
    • 時間復雜度:O(N)

    迭代器

    可以看成是廣義的指針,所以我們使用的時候要加上一個*。

    iterator(默認容器為vector,名稱為v)

    • 最普通的迭代器,也最常用。

    • 定義:vector<typename>::iterator it ;

    • 大多數(shù)我們使用迭代器就是為了遍歷當前容器。

      vector<typename>::iterator it; for(it = v.begin(); it != b.end(); it++)cout<<*it<<" ";//輸出當前容器
    • C++11新特性

      • 使用auto可以減少代碼量,但只有編譯器支持C++11才可以用

        for(auto it : v)cout<<it<<" ";

    reverse_iterator

    • 反向迭代器
    • 用法與iterator相反。
    • 這里用循環(huán)演示一下:for(vector<int>::reverse_iterator it = v.rbegin(); it != v.rend(); it++)

    參考資料

    • c++標準模板庫STL【快速查找】【最全】【常用】【語法】
    • STL底層數(shù)據(jù)結(jié)構實現(xiàn)
    • C++ STL 一般總結(jié)
    • 維基百科

    總結(jié)

    以上是生活随笔為你收集整理的又爱又恨的STL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。