《地心護核者》蘑菇類食譜整理

STL

STL 是“Standard Template Library”的縮寫,中文譯為“標準模板庫”。

#include<algorithm>

#include<bits/stdc++.h>(推薦)

sort()

sort函式用於給一個數組進行排序,在algorithm庫裡。

使用方法為sort(v.begin(),v.end(),cmp)),這裡的v.begin()是開始的指標位置,v.end()是結束的指標位置(這裡的表示是左閉右開,也就是說v.end()並不在排序內容裡),cmp可要可不要,如果使用的是自定義型別且沒有過載運算子就一定需要。

這個陣列的型別可以是自定義型別或者STL中的vector,需要注意的是如果採用的是自定義型別則需要過載運算子(也可以如上面說的一樣用cmp)。

stack

模擬棧,在<stack>裡。

stack <Type> A;

常用函式

A.push(a);

入棧

A.pop();

出棧

A.top();

返回棧頂元素(但不出棧)

queue

模擬佇列,在<queue>裡。

queue <Type> A;

常用函式

A.push(a);

入隊

A.pop();

出隊

A.front();

返回隊首元素(但不出隊)

deque

雙端佇列

priority queue

優先佇列,一個類似於堆的資料結構,在<queue>裡。

預設是大根堆,如果想讓他是小根堆的話有兩種辦法,其中一種是過載小於號。

能以O(logN)複雜度完成插入元素,刪除最值,尋找最值。

Priority_queue <Type> A;

常用函式

A.push(a);

插入

A.pop();

刪除最值(預設為最大值)

A.top();

返回最值(但不刪除)

pair

一個包含兩個可以不同的資料值的型別。

pair <Type1,Type2> A;

往往Type1,Type2都是標準型別,但如果是自定義型別,需要重定義運算子;

常用函式

賦值:make_pair(t1,t2);

返回對應的值:A.first,A.second;

vector

向量(Vector)是一個封裝了動態大小陣列的順序容器。跟任意其它型別容器一樣,它能夠存放各種型別的物件。可以簡單的認為,向量是一個能夠存放任意型別的不定長的動態陣列,在vector庫裡。

定義方式:vector <Type> A;

容器特性

順序序列

順序容器中的元素按照嚴格的線性順序排序。可以通過元素在序列中的位置訪問對應的元素。

動態陣列

支援對序列中的任意元素進行快速直接訪問,甚至可以通過指標算述進行該操作。提供了在序列末尾相對快速地新增/刪除元素的操作。

能夠感知記憶體分配器的(Allocator-aware)

容器使用一個記憶體分配器物件來動態地處理它的儲存需求。

相當於是個動態陣列,每次可以往末端插入一個元素,下標從0開始。

實現方式是每次不夠大的時候暴力倍長,可以發現均攤是線性的。

常用操作

A.clear();

清空

A.push_back(a);

尾部新增元素

A.pop_back();

尾部刪除元素

A.empty();

檢查是否為空,空返回true

v.size()

這個一個unsigned int型別。也就是說對空的vector的size()-1會得到2^32-1。因此寫程式碼的時候應帶儘量避免這種寫法。(或者強制型別轉化成int)

v.resize()

其複雜度是O(max(1, resize()中的引數-原來的size()))的。

如果是大小變大的resize(),且可以指定新擴充套件的位置的值。若未指定則呼叫其預設建構函式,例如int之類的會預設是0。

v.clear()和vector<int>().swap(v)的區別。

前者是假裝清空了,實際記憶體沒有被回收。

後者是真的回收了,不過需要和v.size()的大小成正比的時間。

後者的意思是使用vector<>()這句話呼叫無參的建構函式生成一個vector<>型別的物件,然後和v交換,之後其生存期結束被銷燬會自動呼叫其~vector<>()解構函式。注意<>裡面要寫v一樣的型別(例如int)

set

一個儲存集合的容器,在set庫裡。

map相當於是一個下標可以是任何數值的陣列,如果訪問時沒有賦值就會返回零。

內部使用紅黑樹(一種平衡樹)實現。

當set<>中的第一個引數是自定義型別的時候需要重新定義小於號。

複雜度基本上是O(log(當前大小))。

定義方式:set <Type> A;

常用函式

A.insert(a);

插入a

A.erase(a);

刪除a:

A.find(a);

查詢a,如果查詢成功,返回對應指標,查詢失敗返回尾指標

A.begin(),A.end();

返回頭指標與尾指標,尾指標不儲存具體內容

map

儲存一個從key到value的對映。某種意義上就是“廣義”陣列,在map庫裡。

map相當於是一個下標可以是任何數值的陣列,如果訪問時沒有賦值就會返回零。

內部使用紅黑樹(一種平衡樹)實現。

當map<,>中的第一個引數是自定義型別的時候需要重新定義小於號。

複雜度基本上是O(log(當前大小))

map <Type1,Type2> A;Type1是key型別,Type2是value型別。

可以通過A[B]=C這種形式賦值,B為Type1,C為Type2。

常用函式

A.clear();

清空

A.empty();

判斷是否為空

A.insert(pair<Type1,Type2> (C,D));

插入(不建議這麼寫)

A.erase(B);

刪除,B可以是key值也可以是指標

A.begin(),A.end();

頭指標,尾指標

m[x]

哪怕你什麼也不幹只寫一個m[x];也會新建一個點。

因此當你想知道map中是否存在這個對映的時候最好使用m.count(x)。

很多時候可以有效卡常。

multiset和multimap

是可重集合和可重對映。

有兩個注意的:第一個是count函式複雜度變成了O(lg(集合大小)+答案)的,也就是如果有很多相同元素,那麼count函式代價很大。

第二個是刪除x的話,使用s.erase(x)會把所有權值為x的刪除。

如果只想刪掉一個需要s.erase(s.find(x))。

unordered_set和unordered_map

基於雜湊實現的集合和對映。

基本上裡面的型別只能是int,long long,double這種非自定義型別。 因為其基於雜湊)

在c++11及以後存在,之前沒有,亂用可能會CE。

空間常數比較大,時間常數不小,比陣列訪問慢很多,慎用。

不能順序遍歷,不支援lower_bound。

迭代器

只介紹set/map的迭代器。

bitset

高精度壓位二進位制。

一個用於處理二進位制串的“陣列”,在<bitset>裡。

所有時間複雜度是線性的操作,常數都是1/32大概。

下標從0開始。

bitset <n> A;//n為長度;

支援所有位運算: << , >> , & , | , ^ ;

常用函式

A.count();

統計1的個數

A.reset();

清0

A.set();

全賦為1

A.size();

返回位數

lower bound()/upper bound()

lower_bound(v.begin(),v.end(),c)可以在一個有序陣列當中找出剛好大於或等於c的數,在algorithm庫裡,可以使用自定義型別,用法與sort相類似。

upper_bound函式類似,這個函式則是在有序陣列中找出剛好大於c的數。

next permutation/prev permutation(全排列演算法)

algorithm標頭檔案中包含了next_permutation(v.begin(),v.end())和prev_permutation(v.begin(),v.end())兩個全排列函式,分別給出一個序列在全排列中的下一個和上一個序列(按字典序),如果存在這樣的序列則返回true,不存在則返回false,但仍會得到一個序列。

對於一個任意元素不相同的序列來說,正序排列是最小的排列方式,相應的逆序排列是最大的排列方式,以整數序列{1,2,3}為例,{1,2,3}是第一個排列,{3,2,1}則是最後一個排列,因此序列{1,2,3}沒有上一個序列,{3,2,1}沒有下一個序列。

pq.swap(pq2)

並非原創,僅是整理,請見諒

以上是 《地心護核者》蘑菇類食譜整理 的全部内容, 来源链接: utcz.com/yxgl/577587.html

回到顶部