在這篇中,我會講幾個簡單易懂且比較常用的stl函式,這些函式在noip系列考試中往往被允許使用(既然讓用我們自然不用手碼了...)
(末尾有驚喜!)
絕大部分剛入門的oier第乙個接觸的stl函式就是sort函式,這是乙個簡單而又快速的排序函式
通過內部整合的快速排序的**,可以在o(nlogn)的時間內完成乙個長度為n的數列的排序(預設排序方向為由小到大)
實現起來非常簡單,**就一行(例子為排序x[1]~x[5]):
sort(x+1,x+5+1);//x表示你要排序的陣列名,x+1表示從1開始(因為陣列開始的預設下標為0)但同時,很多人會發現,你不是說這是預設由小到大的嗎?我要從大到小該怎麼辦呢?//x+5+1表示到5結束(為什麼要+1呢?因為我們要等於5,如果不+1的話意思是小於5的,自然就沒有x[5]了)
這時候我們有兩種選擇:你可以過載運算子,也可以寫乙個比較函式
(前乙個比較麻煩,我在下面乙個講優先佇列時說)
我在這裡先說一下比較函式
顧名思義,這個比較函式的作用就是告訴sort函式,我在排序時要怎樣對待每兩個元素
我們可以看一下這個比較函式的主體:
有了這個,我們就能讓sort隨心所欲!
函式名:sort
用途:排序乙個陣列
標頭檔案:#include
用法:sort(x+起始位置,x+終止位置+1,比較函式)(沒有特殊需要比較函式可以省略)
(在這個部分裡,請大家預設將優先佇列當成堆)
大家玩過堆排序嗎?
優先佇列,其實就是堆排序,不過用起來會更方便(和上面一樣,乙個函式與一行**的區別)
和sort拿來就能用不同,由於這是乙個佇列,需要存東西,所以在使用前,我們需要宣告一下
比如說我要開乙個堆,那我要這麼做:
很簡單,不是嗎?那我們又該如何使用這個佇列呢?
下面我講幾個操作:
我們可以這樣寫:
q.push(val);q在這裡代表佇列名稱,push是插入的意思,val則是你要插入的值
在這裡我們要特別注意,val的型別必須和我們宣告的優先佇列的型別相同
(好像有時候佇列定義是long long你插個int也無所謂),但如果你定義的是int,但你從插的是個double,那麼這個double會被強制取整
如果你定義的是結構體,你直接插入結構體就行(佇列會自動將結構體的每乙個元素都插進去)
我們可以這樣寫:
int a=q.top();這裡的意思是定義乙個整數為該堆的堆頂(不只是int,你定義的堆是什麼型別,他就給你返回什麼型別)
堆頂是什麼取決於你如何過載運算子,(不過預設是大根堆)
我們可以這樣寫:
q.pop();這句話表示堆頂元素出隊,然後程式會自動維護整個堆,使其仍滿足堆的性質
我們可以這樣寫:
int a=q.size();進行這個操作後a就代表堆的大小
過載運算子的作用就是改變某個序列中符號的定義
首先明確,在優先佇列裡,由於他預設的是大根堆,所以我們過載大於號
依個人所見,如果你要將非結構體的大根堆變為小根堆,是不需要過載運算子的
我們只要在入隊時取反,出隊時取反即可(負負得正)
過載運算子,(我可能比較蒟蒻)一般過載的物件是結構體
我們一般這樣寫:
通過這樣乙個函式,我們可以改變結構體陣列中某些符號的含義,自然兩兩比較方式也就發生了改變
這個堆自然也就可以比較別的東西了
標頭檔案:#include
定義方法:priority_queueq(佇列名)
用途:進行堆排序,構建乙個二叉堆(至於有了堆能幹什麼,就看你們了)
操作:push():插入元素
top():返回堆頂元素的值
pop():刪除堆頂元素
size():返回當前堆的大小
變形方式:過載運算子
本來這個地方想放vector的,但感覺好像並沒有什麼卵用,於是我講一講雜項。
memset功能強大,但我在這裡只講如何利用memset歸零乙個陣列
看圖:
就是這樣,是不是很簡單?
函式名:memset
標頭檔案:#include
用途:初始化陣列
用法:memset(陣列名,初始值,大小);
有的時候,我們會遇到需要讀取乙個不定長的字串(比如說有的題讓你匹配字串,像kmp,hash之類的)
我們就需要用一點手段獲取字串的長度(當然,你別告我拿個迴圈跑,你多跑幾次就發現**行滿了)
我們請出strlen()函式
這個函式的作用就是讀取乙個字串,並返回這個字串的長度
看圖:通過如上函式,我們可以解決字串的長度問題。
函式名:strlen
標頭檔案:#include
用途:統計字元陣列長度
用法:定義乙個整數=strlen(你要統計長度的數列)
入門級c++stl到此結束,其實比較簡單的還有vector(變長陣列),set(平衡樹,內部實現是一棵紅黑樹),map(對映,表示兩個資料間的關係),為了對新手更為友好,我就暫時不講。
C STL使用入門
stl standard template library,標準模板庫 我最開始接觸c 程式設計是從dos下的borland c 開始的。那時他們在最新版本3.1中就包含了一套模板庫用來做collection.那真是個好東東。當我開始使用visual c 2.2的時候,我甚至試圖去把borland公...
C STL簡單應用
include include include 容器 陣列的增強版 include 去重,排序 include 自動建立key value對應 include 棧 先進後出 include 佇列 先進先出 using namespace std int main vector v a,a 3 不能直...
C STL簡單應用
string 表示可變長度的字串行 字串是物件 string 類支援字串物件的各種操作 各種初始化方式 字串之間的複製 比較 連線 查詢字串長度和判斷字串是否為空 訪問字串中的單個字元 使用string 類要包含標頭檔案 include include using namespace std int...