某些函式後面有帶小括號的註解,小括號中各引數的順序就是傳入的引數的順序。
stl
-
queue
宣告:queuename;(其他容器如無特別標註則宣告方式與此相同) 函式:front,back,empty,size,push,pop,swap(c++11)
比較運算子:==,<=,>=,<,>,!=:按照字典序比較兩個queue(c++20)
-
priority_queue
函式:top,empty,size,push,pop,swap -
stack
函式:top,empty,size,push,pop,swap(c++11)比較運算子:==,<=,>=,<,>,!=:按照字典序比較兩個stack(c++20)
-
map/unordered_map
宣告:map<first值型別,last值型別> name;函式:[], begin,end,rbegin,rend,empty,size,clear,insert,erase,find,lower_bound(返回指向首個不小於給定鍵的元素的迭代器 ),upper_bound
tips:如果map的鍵值是一個struct,那麼需要定義比較(<)。定義方法:bool operator <(const item &a){return x < a.x}(以x升序),unordered_map則不需要定義比較;一定要使用mp.lower_bound()而不是lower_bound(),直接用lower_bound()時間複雜度是不對的。
-
set/multiset
函式:begin,end,rbegin,rend,empty,size,clear,insert,erase,find,lower_bound,upper_boundtips:對於multiset,在erase時,如果只想擦除一個值的一個元素,不能使用erase(x),一個較好的實現方式是erase(find(x));一定要使用st.lower_bound()而不是lower_bound(),直接用lower_bound()時間複雜度是不對的。
-
vector
函式:begin,end,rbegin,rend,empty,size,clear,insert(在pos前插入x/在pos前插入cnt個x),erase(擦除pos處的元素/擦除[first, last)處的元素),push_back,pop_back,lower_bound,upper_bound比較運算子:==,<=,>=,<,>,!=:按照字典序比較兩個vector(c++20中移除)
-
bitset
函式:[],count,size,二進位制操作,set(pos,val),flip(pos)(翻轉指定位)宣告:bitset<長度> name。
bfs
注意每往佇列裡扔一個元素就要把vis標記為1,否則時間複雜度可能有問題。
字串
以 string 為模板。
- size
- insert:(在pos處插入cnt個ch)(在pos處插入s)
- erase:(擦除pos處字元)(擦除從pos處開始的len個字元)
- find:(查詢字串s在pos處之後的首次出現位置)返回值是首個字元的下標,如果沒有則返回s.npos
- rfind:(查詢字串s在pos處之後的最後一次出現位置)返回值是首個字元的下標,如果沒有則返回s.npos
- substr:(獲得從pos處開始的len個字元構成的字串)
- 比較運算子<,=,<=...:字典序比較
- +=:拼接兩個字串
- getline(cin,ss):讀入帶空格的字串
輸入格式
對於scanf,printf:
"%02d":兩位整數(例如13,02,05)。
"%.2lf":兩位double(例如0.13,0.02,0.05)。
雜項
memset賦足夠大值用0x3f,0和-1可以直接賦。
關閉輸入輸出流以加速讀寫:
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
常用演算法
Floyd:
for (int k = 1; k <= n; k++) {
for (int x = 1; x <= n; x++) {
for (int y = 1; y <= n; y++) {
f[x][y] = min(f[x][y], f[x][k] + f[k][y]);
}
}
}
並查集
void find(size_t x) { return pa[x] == x ? x : pa[x] = find(pa[x]); }
dijkstra
struct edge {
int v, w;
};
struct node {
int dis, u;
bool operator>(const node& a) const { return dis > a.dis; }
};
vector<edge> e[maxn];
int dis[maxn], vis[maxn];
priority_queue<node, vector<node>, greater<node> > q;
void dijkstra(int n, int s) {
memset(dis, 63, sizeof(dis));
dis[s] = 0;
q.push({0, s});
while (!q.empty()) {
int u = q.top().u;
q.pop();
if (vis[u]) continue;
vis[u] = 1;
for (auto ed : e[u]) {
int v = ed.v, w = ed.w;
if (dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
q.push({dis[v], v});
}
}
}
}