寫在前面:這又是四月份了,以往每年的這個時候藍橋省賽都早早結束了,今年受這新冠病毒影響,聯考藍橋四六級等等都往後延期,想必也是前無古人了,希望也是後無來者吧!由于今年藍橋延後,咱現在還是暫未開學啊,備賽時間也是無比的長,這幾天玩的可嗨,靜下心來水一篇部落格。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)取完隊首元素之後,隊首元素要彈出,不然你一直取得都是他。取隻是取值,并沒有把它從桶裡拿出來,把他拿出來後邊的元素才有機會出來。
執行個體:
測試運作:
set有一個特點,他裡面的元素隻出現一次,也就是你隻要放進去的元素,不會有重複的,你要放重複的,他不會給你放進去的,那這個特點可以用來有效地去重。而且,進入set的元素,都會自動進行字典排序。這個set周遊要用疊代器,就是指向内部元素的一種指針。
傳回某個值元素的個數:count();
如果集合為空,傳回true:empty();
傳回指向最後一個元素的疊代器:end();
傳回指向第一個元素的疊代器:begin();
删除集合中的元素:erase();
傳回一個指向被查找到元素的疊代器:find();
在集合中插入元素:insert();
集合中元素的數目:size();
類似于數組用法,可以直接使用下标取值,但是不能使用下标指派!!!特點就是相關函數的使用,計算數組大小,是否為空
常用操作:
定義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();
類似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);
排序函數,預設升序排序,時間複雜度n*lg(n),屬于優化過的快速排序
使用方法:
升序排序a[0]到a[9]:sort(a,a+10);
單純的升序排序不可能滿足所有人的需求,,那就可以重寫傳參函數cmp作為sort的字三個參數,進行自定義的排序方法,寫函數的方法有很多種,比如結構體排序中你可以使用結構體的某一個元素進行排序等
測試結果:
兩個全排列函數,next是下一個排列,prev是上一個,,,他會根據你的傳參進行字典序的全排列,是以
注意:你使用這個函數之前,必須確定你傳給他的資料是單調的(可以sort()一下),不然他會排列不完整!!!!
說明:比如你給next傳參“231”,他會找字典序下一個排序,而“123”這個序列是在他的上邊,會周遊不到這個序列的!!!
使用do-while,将函數放在while中,處理語句放在do中,排序出來的序列還是存在原數組,然後進行下一步字典排列,,,一定要注意,你在do中不能對數組元素進行指派等操作,隻能取值,,因為指派會對下一步的全排産生影響!!!!
總的來說,用這些容器可以減少我們的代碼量,用法很多,注意事項也挺多,暫時我了解的也就這麼點,隻能分享這一點,後期我學習到其他的會再來的