c stl應用入門

2022-02-27 06:34:26 字數 2952 閱讀 8310

在這篇中,我會講幾個簡單易懂且比較常用的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...