天天看點

STL常用容器和常用函數

寫在前面:這又是四月份了,以往每年的這個時候藍橋省賽都早早結束了,今年受這新冠病毒影響,聯考藍橋四六級等等都往後延期,想必也是前無古人了,希望也是後無來者吧!由于今年藍橋延後,咱現在還是暫未開學啊,備賽時間也是無比的長,這幾天玩的可嗨,靜下心來水一篇部落格。stl在我們的平日代碼題目資料結構題目中可以大大減少我們的代碼量,他一個函數就可以解決你的排序、去重、全排列。

主題:藍橋杯大賽巧用c++中的stl容器和函數

我認為比較常用的stl容器有這幾個:queue、set、vector、string

常用的stl算法有這幾個:sort、next_permutation和prev_permutation函數

目錄

一、queue容器

二、set容器

三、vector容器

四、string容器

五、sort函數

預設字典升序排序

使用cmp自定義排序類型:

六、next_permutation和prev_permutation函數

queue——隊列,裡面的元素服從先進先出,通俗講就是你按順序把123456放進去,往外取的時候,順序還是123456,這個在寫廣搜的時候,應用很廣泛(因為廣搜中你先周遊到的點後邊周遊要優先考慮)。你可以把他想象為一個桶,你今天往裡扔東西,取得時候先拿到的是最先扔進去的那個。

常用操作方法:

首先必須引用頭檔案:#include <queue>

定義一個隊列(尖括号裡是隊列裡元素的類型,可以很多種,結構體也可以且是常用的):queue<int >q;

插入一個元素:q.push(a);

傳回隊首元素:q.front();

彈出隊首元素: q.pop();

查詢隊列長度: q.size();

查詢隊列是否為空(傳回值為bool類型的true或false):q.empty(); 

查詢隊尾元素:q.back();

注意:

(1)必須是c++,要有using namespace std;

(2)必須引用頭檔案:#include <queue>

(3)取完隊首元素之後,隊首元素要彈出,不然你一直取得都是他。取隻是取值,并沒有把它從桶裡拿出來,把他拿出來後邊的元素才有機會出來。

執行個體:

測試運作:

STL常用容器和常用函數

set有一個特點,他裡面的元素隻出現一次,也就是你隻要放進去的元素,不會有重複的,你要放重複的,他不會給你放進去的,那這個特點可以用來有效地去重。而且,進入set的元素,都會自動進行字典排序。這個set周遊要用疊代器,就是指向内部元素的一種指針。

傳回某個值元素的個數:count();

如果集合為空,傳回true:empty();

傳回指向最後一個元素的疊代器:end();

傳回指向第一個元素的疊代器:begin();

删除集合中的元素:erase();

傳回一個指向被查找到元素的疊代器:find();

在集合中插入元素:insert();

集合中元素的數目:size();

STL常用容器和常用函數

類似于數組用法,可以直接使用下标取值,但是不能使用下标指派!!!特點就是相關函數的使用,計算數組大小,是否為空

常用操作:

定義v容器:

vector<t> v1;               //vevtor儲存類型為t的對象。預設構造v1為空。

vector<t> v2(v1);           //v2是v1的一個副本,v1和v2的元素類型必須相同

vector<t> v3(n,i);          //v3包含n個值為i的元素

vector<t> v4(n);           //v4包含初始化的元素的n個副本,預設元素值為0

把x放入容器:push_back(x);    

容器大小:size();

容器判空:empty();

STL常用容器和常用函數

類似char數組但是比其更好用,可以直接進行加減或相關函數的使用

定義s容器:

     string s1;   //初始化字元串,s1為空

     string s2 = s1;? //複制初始化,複制s1到s2

     string s3 = "test"; //直接初始化,s3是“test”

     string s4(10, 'a'); //s4=“aaaaaaaaaa”

     string s6("test"); //直接初始化

字元串拼接:直接加減:s+="xxxx";s+=s1;

字元串查找:find("te");

0-2位置替換:replace(0, 2, "tt");

比較s1、s2:s1.compare(s2)

取1-3位置子串:substr(1, 3);

插入到3位置前:insert(3, "tt");

删除0-2位置字元:erase(0, 2);

STL常用容器和常用函數

排序函數,預設升序排序,時間複雜度n*lg(n),屬于優化過的快速排序

使用方法:

升序排序a[0]到a[9]:sort(a,a+10);

STL常用容器和常用函數

單純的升序排序不可能滿足所有人的需求,,那就可以重寫傳參函數cmp作為sort的字三個參數,進行自定義的排序方法,寫函數的方法有很多種,比如結構體排序中你可以使用結構體的某一個元素進行排序等

測試結果:

STL常用容器和常用函數

兩個全排列函數,next是下一個排列,prev是上一個,,,他會根據你的傳參進行字典序的全排列,是以

注意:你使用這個函數之前,必須確定你傳給他的資料是單調的(可以sort()一下),不然他會排列不完整!!!!

說明:比如你給next傳參“231”,他會找字典序下一個排序,而“123”這個序列是在他的上邊,會周遊不到這個序列的!!!

使用do-while,将函數放在while中,處理語句放在do中,排序出來的序列還是存在原數組,然後進行下一步字典排列,,,一定要注意,你在do中不能對數組元素進行指派等操作,隻能取值,,因為指派會對下一步的全排産生影響!!!!

STL常用容器和常用函數

總的來說,用這些容器可以減少我們的代碼量,用法很多,注意事項也挺多,暫時我了解的也就這麼點,隻能分享這一點,後期我學習到其他的會再來的

繼續閱讀