C STL學習筆記

2021-10-02 03:37:56 字數 4365 閱讀 6127

stl是個寶

由於c++ stl的開放,代替了那些需要老老實實寫結構體來實現堆疊二叉樹等資料結構的c等語言,很多演算法不需要自己來實現了

所有容器都有的兩個時間複雜度為o(1)的方法:

a.size() 返回容器中元素的個數

a.empty() 返回容器是否為空

vector也叫變長陣列,即陣列長度可以動態變化。用到了倍增的思想

基本操作:

初始化vector的方法

vector<

int>a(

10); 開乙個長度為10 的vector陣列

vector<

int>a(

10,3)

; 把每乙個元素初始化為特定的3

vector<

int> a[10]

; 定義10個vector

vector<

int> a; 普通定義法

vector的常用方法

tips:c++裡有乙個特點 ,當作業系統為某乙個程式或者程序分配空間的時候,所需的時間基本上和空間大小無關,僅僅與申請次數無關

舉個栗子就是:申請乙個長度為1000的陣列和1000個長度為1的陣列 ,時間上有1000倍的區別。

所以進行優化時優化的思路是要儘量減少vector申請空間的次數,可以浪費空間

總結起來:

vector的倍增思想如下,首先申請32位,當32位不夠的時候,新建乙個長度大一倍的vector,然後把舊32位copy到新32位上,這樣的話就新開了32位出來。

vector還支援乙個黑科技:比較運算

vector<

int>a(

4,3)

,b(3

,4);

if(a

puts

("yes");

輸出結果顯示a

這種比較是按字典序比較的

在數學中,字典或詞典順序(也稱為詞彙順序,字典順序,字母順序或詞典順序)是基於字母順序排列的單詞按字母順序排列的方法。 這種泛化主要在於定義有序完全有序集合(通常稱為字母表)的元素的序列(通常稱為電腦科學中的單詞)的總順序。

對於數字1、2、3…n的排列,不同排列的先後關係是從左到右逐個比較對應的數字的先後來決定的。例如對於5個數字的排列 12354和12345,排列12345在前,排列12354在後。按照這樣的規定,5個數字的所有的排列中最前面的是12345,最後面的是 54321。

pair或pair等不同或同種型別變數

訪問元組中的第一/第二個元素的方法是first()和second()方法

pair的初始化方法

pair<

int,string> p;

p =make_pair(10

,"abc");

p=

pair的用處:

假設乙個東西有著兩種不同的屬性,並需要按照某乙個數為標準進行排序。

即可把要排序的關鍵字放到first裡面,即可完成排序

pair是支援比較運算的,以first為第一關鍵字,以second為第二關鍵字進行比較(也相當於是一種字典序)

pair可以用於儲存多元組

多元組儲存方法為

pair<

int,pair<

int,

int>> p;

pair相比於結構體

pair已經幫我們實現了乙個結構體,且幫我們寫好了乙個比較函式

處理字串的利器

支援的方法

字串加法

string a =

"abc";a+

="def";a+

='g'

;輸出a: abcdefg

substr()方法

substr返回的是乙個子串,有兩個要傳入的引數,第乙個引數是起始位置,第二個引數是子串的長度

a.substr

(1,10);

第二個引數可省略,省略的話直接叫後面的字串輸出完

當長度大小到頂了,就輸出到最後一位為止

c_str()方法 【 返回字串的起始位址以便輸出 】

printf

("%s"

,a.c_str()

);即可正常輸出字串a

size()方法=length()方法

返回陣列長度

先進先出

常用方法

push() 向隊尾插入乙個元素

front() 返回隊頭元素

back() 返回隊尾元素

pop() 彈出隊頭元素

queue是沒有clear函式的 要清空乙個佇列直接重新構造就可以實現了

堆是乙個二叉樹,父節點的值一定比子節點大。所以隊頭一定是全隊裡最大的。

定義的堆預設是大根堆,即根節點最大

那麼怎麼實現小根堆呢?

方法1在插入乙個元素的時候,直接插入這個數的負數(小技巧)

方法2在定義堆的時候就把後面兩個引數寫出來

priority_queue,greater> heap

常用方法

push() 插入乙個元素

pop() 彈出棧頂元素

top() 返回棧頂元素(極值)

先進後出

常用方法

push() 向棧頂插入乙個元素

top() 返回棧頂元素

pop() 彈出棧頂元素

隊頭隊尾均可插入刪除,隊內元素可直接訪問,相當於加強版的vector

什麼操作基本都支援,但是速度很慢,用的話要謹慎

常用方法

基於平衡二叉樹(紅黑樹,是平衡二叉樹的一種)來實現的,本質上是動態地維護乙個有序的序列

介紹及常用方法

set/multiset

所有操作的時間複雜度是o(logn)

set與multiset的區別:set每個元素最多隻出現一次,大於一次的操作都會被忽略,但是multiset沒有這個限制,每個元素可以出現多次。

insert() 插入乙個數

find() 查詢乙個數

count() 返回某乙個數的個數。當然,在set中只可能取0或1。

erase() 兩種引數:

(1)輸入的是乙個數x,刪除所有x

(2)輸入乙個迭代器,刪除這個迭代器

核心操作:lower_bound()/upper_bound()

lower_bound() 返回大於等於x的最小數的迭代器

upper_bound() 返回大於x的最小數的迭代器

map/multimap

所有操作的時間複雜度是o(logn)

首先說map:

map是從鍵(key)到值(value)的對映。因為過載了[ ]運算子,map像是更高階版的陣列。

例:用乙個mapmonth_name來表示「月份名字到月份編號」的對映,然後用month_name[「july」]=7這樣的方式來賦值。

multimap:

map 與 multimap是儲存key-value(鍵-值 對)型別的容器。

不同之處在於:map只允許key與 value一一對應;multimap乙個key可對應多個value;

insert() 插入的引數是pair

erase() 輸入的引數是pair或者迭代器

lower_bound() 返回大於等於x的最小數的迭代器

upper_bound() 返回大於x的最小數的迭代器

[ ] 與普通陣列類似

c++中已經實現好了的雜湊表

它們是基於雜湊表實現的

unordered造成的影響是所有基於排序的方法都不能用,但是時間複雜度由o(n)變為o(1)

bitset容器是實現「壓位」的操作。因為如果用bool來表示二進位制數的話,1024位bool需要1024位元組空間來表示,而bitset只需要128位元組。即——

bitset容器表示方法會比普通表示方法省8倍的空間。

基本方法

C STL 學習筆記

一 stl a include include using namespace std 1 void sort iterator start,iterator end void sort iterator start,iterator end,strictweakordering cmp cmp 函...

C STL學習筆記

remove if使用方法 int a vectorarr a,a 14 std remove if arr.begin arr.end std bind2nd std less 100 for int i 0 i arr.size i 輸出結果為 240 100200 300102 555100 ...

C STL學習筆記 1

本文面向的讀者 學習過c 程式語言 也就是說學習過template 但是還沒有接觸過stl的stl的初學者。這實際上是學習stl的一篇筆記。什麼是泛型程式設計 我們可以簡單的理解為 使用模板的程式設計就是泛型程式設計。就像我們我們可以簡單的理解物件導向程式設計就是使用虛函式的程式設計一樣。stl是什...