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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

又爱又恨的STL

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

又愛(ài)又恨的STL:

文章目錄

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

STL(標(biāo)準(zhǔn)模板庫(kù))

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

容器:

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

    • 底層實(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> > 的是,一維的長(zhǎng)度已經(jīng)固定了。
    • 訪問(wèn):

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

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

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

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

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

    name.erase(it)刪除當(dāng)前迭代器it指向的值。時(shí)間復(fù)雜度O(1)

    name.erase(value)刪除value這個(gè)值。時(shí)間復(fù)雜度O(logN)

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

    string-字符串

    • string 讀入可以用cin,輸出可以用cout,也可以用printf("%s",ss.c_str());
    • 頭文件:#include<string>
    • 定義:
      • 一維:string str;
      • 二維:string str[maxx];
    • 訪問(wèn):
      • 通過(guò)下標(biāo)訪問(wèn)
      • 通過(guò)迭代器訪問(wèn)
    • 常用技巧
    clear()+===、!=、<、<=、>、>=length()/size()substr(pow,len)
    清空拼接賦值通過(guò)字典序來(lái)比較大小長(zhǎng)度返回從pos號(hào)位開(kāi)始,長(zhǎng)度為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開(kāi)始的len長(zhǎng)度的字符個(gè)數(shù)
    • find()
      • find(str2) 找到子串第一次出現(xiàn)的位置,若不是,返回string::npos ^ 1
      • find(str2,pos) 從str的pos開(kāi)始開(kāi)始匹配str2
      • 時(shí)間復(fù)雜度為:O(nm)。其中n、m分別是str和ser2的長(zhǎng)度
    • repalce()
      • replace(pos,len,str2) 把str從pos號(hào)位開(kāi)始,長(zhǎng)度位len的子串替換為str2
      • replace(it1,it2,str2) 把str的迭代器[it1,it2)范圍的子串替換為str2
      • 時(shí)間復(fù)雜度為:O(str.size())。

    map-鍵值對(duì)(key-value)

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

    • 頭文件:#include<map>

    • 定義:map<typename1,typename2 > name

    • 訪問(wèn):

      • 通過(guò)下標(biāo)訪問(wèn)

      • 通過(guò)迭代器訪問(wèn)

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

    函數(shù)名find(key)size()clear()
    功能返回key的映射的迭代器長(zhǎng)度清除
    時(shí)間復(fù)雜度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-隊(duì)列

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

    priority_quque-優(yōu)先隊(duì)列(自動(dòng)排序的隊(duì)列)

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

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

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

        • 將重載放到結(jié)構(gòu)體內(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)先級(jí)高} } priority_queue<student> q;
        • 將重載放到結(jié)構(gòu)體外

          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-棧

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

    • 頭文件:#include<stack>

    • 定義:stack<typename > name;

    • 訪問(wèn):使用top()來(lái)訪問(wèn)棧頂元素

    • 常用函數(shù):

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

    pair-對(duì)

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

    算法

    sort()與stable_sort()

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

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

      • 用法:

        • 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)定的排序

      • 時(shí)間復(fù)雜度O(NlogN);

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

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

    random_shuffle()

    • 對(duì)指定范圍被的元素隨機(jī)排序
    • 時(shí)間復(fù)雜度O(1);

    lower_bound()與upper_bound()

    • 二分查找函數(shù),返回的是迭代器
    • lower_bound():
      • 用法:lower_bound(v.begin(),v.end(),20)-v.begin();//在vector里面查找第一個(gè)大于或等于20的下標(biāo)
      • 返回第一個(gè)大于或等于查找的數(shù)的地址。
    • upper_bound():
      • 用法:upper_bound(v.begin(),v.end(),20)-v.begin();//在vector里面查找第一個(gè)大于20的下標(biāo)
      • 返回第一個(gè)大于查找的數(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));
    • 時(shí)間復(fù)雜度:O(N!)

    unique()

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

    迭代器

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

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

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

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

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

      vector<typename>::iterator it; for(it = v.begin(); it != b.end(); it++)cout<<*it<<" ";//輸出當(dāng)前容器
    • 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++標(biāo)準(zhǔn)模板庫(kù)STL【快速查找】【最全】【常用】【語(yǔ)法】
    • STL底層數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)
    • C++ STL 一般總結(jié)
    • 維基百科

    總結(jié)

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

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