c++中acm常用stl和function等
阿新 • • 發佈:2018-12-15
容器
注://符號表示不常用。 · stringstream name(st) (sstream) 神一般的操作 將字串st轉化為輸入流,可以用來name>>str. · vector<int>name(n,v) 變數name是一個vector,每個元素為int,初始化為n個元素,值均為v. + 資料結構為最簡單的一維陣列。 + 運算子:可以直接使用[]訪問元素。 + 建構函式: 可以不初始化 vector(n) vector(n,v) + 方法: empty()判斷是否為空 //at() 返回指定位置的元素(直接[]就好了嘛) size() 返回Vector元素數量 clear() 清空所有元素 erase() 刪除指定元素 insert() 插入元素到Vector中 pop_back() 移除最後一個元素 push_back() 在Vector最後新增一個元素 //size_typezise()返回當前vector中的實際的元素個數 //size_typemax_size()返回標準庫給vector允許分配的最大元素個數 //size_typecapacity()返回當前可容納的vector元素的個數 //referencefront()返回當前vector首元素的引用,要求vector非空 eg.與front()的區別為const,我也不清 //referenceback()返回當前vector末尾元素的引用,要求vector非空 eg.與end()的區別為const,我也不清 ·注:vector沒有push_front()和pop_front()要在任意位置插入元素用insert(iterator pos,int a)在pos前插入a。 刪除指定元素用erase(iteratorpos),刪除指定區間的元素用 erase(iterator first,iterator last)刪除[first,last)區間的元素。 Clear呼叫erase()刪除[begin(),end())之間的所有元素,即清空vector · set<string>name 變數name是一個型別為string的集合,即所有元素最多出現一次。且自動按<號排序 + 資料結構為紅黑樹。以節點形式儲存(動態),進行操作後原有的iterator指向的內容不變。 + 運算子:不可以引用[]。需要用迭代器iterator訪問。 + 建構函式: insert() ,插入一個值 begin() end() ,左閉右開,頭尾iterator clear() ,刪除set容器中的所有的元素 empty() ,判斷set容器是否為空 size() ,返回當前set容器中的元素個數 //max_size() ,返回set容器可能包含的元素最大個數 count() 用來查詢set中某個某個鍵值出現的次數,鍵值在set只可能出現0或1次,這樣就變成了判斷某一鍵值是否在set出現過了 //equal_range() lower_bound(key_value) ,返回第一個大於等於key_value的定位器(iterator) upper_bound(key_value),返回最後一個大於等於key_value的定位器(iterator) · map<string,int>name 變數name是一個從string到int的一個對映。 + 資料結構為紅黑樹。 + 運算子:[]已被過載,可以用name["wbt"]=161082賦值(若"wbt"已經存在,則修改其值,不存在則insert) + 建構函式: insert(pair<string,int>("aclive",102))插入一對值,跟[]不同的是,此處要涉及到集合中元素唯一性,即"aclive"存在時插入失敗 跟set有點類似。 · queue<type>q; 申請一個type型別的佇列 queue 的基本操作有: 入隊,如例:q.push(x); 將x 接到佇列的末端。 出隊,如例:q.pop(); 彈出佇列的第一個元素,注意,並不會返回被彈出元素的值。 訪問隊首元素,如例:q.front(),即最早被壓入佇列的元素。 訪問隊尾元素,如例:q.back(),即最後被壓入佇列的元素。 判斷佇列空,如例:q.empty(),當佇列空時,返回true。 訪問佇列中的元素個數,如例:q.size() · stack<type> empty(判斷是否為空) size (返回棧的元素個數) top(返回棧頂元素) push_back (入棧) pop_back (出棧) · 優先佇列 priority_queue<int> q; · 雙端佇列 deque<ll>q;//定義一個雙向佇列q,型別為long long q.push_front(a);//將a從隊首插入佇列 q.push_back(a);//將a從隊尾插入佇列 q.pop_front();//隊首彈掉一個元素 q.pop_back();//隊尾彈出一個元素 a=q.front();//返回隊首元素 a=q.back();//返回隊尾元素 a=q.size();//返回雙向佇列的大小 a=q.empty();//判斷雙向佇列是否為空,為空返回1,不為空返回0 deque<ll>p(q);//將佇列q複製一個新的佇列p q.clear(); //將佇列q清空
函式
<algorithm> · int a[n]; - int* lower_bound(a,a+n,x); 從陣列a,查詢n個元素(第a[n]不找)。二分查詢第一個 >= x的位置,要求<號必須定義過,且a升序。 若陣列全都小於x,則返回 地址a+n。 ·- int* upper_bound(int* a,int* a+n,int x) 跟lower_bound類似,唯一區別就是 查詢的是第一個 > x的位置 ·- sort(a,a+n,cmp) 第三個引數可以省略,即升序。(我覺得也可以定義小於號) cmp函式: bool cmp(int a,int b) { return a<b; //從小到大 } ·- bool next_permutation(a,a+n) 求a地址開始n個元素的下一個全排列,其中123是第一個全排列,321是最後一個,若a中元素已經是最後一個321, 則結果是第一個全排列123並返回false,其餘情況返回true。 a陣列可以為char,也可以為int。 ·- bool prev_permutation(a,a+n) 求上一個全排列 和next_permutation類似, <stdlib.h> / <cstdlib> ·- qsort(array,n,sizeof(int),comp) comp函式: int comp(const void*a,const void*b) { return *(int*)a-*(int*)b;//從小到大 } <string> ·- int string.find(char/string s1,int i) 查詢s中第i個位置(包括i)第一次出現s1相對與string的位置(i到結尾),並返回(包括0) - s.rfind(s1,i) (倒著查詢,0到i的位置(i到結尾)(包括i),同上) - s.replace(pos, n, s1) 用s1替換s中從pos開始(包括0)的共n個字元的子串,可與find搭配。
其它
其他函式—————————————————————————— <ctype.h>/<cctype> · int(or bool) isalpha(char ch) 一種函式:判斷字元ch是否為英文字母,若為英文字母,返回非0(小寫字母為2,大寫字母為1)。若不是字母,返回0。 在標準c中相當於使用“ isupper( ch ) || islower( ch ) ”做測試, · isupper/islower 此為巨集定義,非真正函式。 · tolower(char ch)/toupper(char ch) 若ch為小寫字母,則將ch轉換為大寫字母返回,若為大寫字母或其他字元,直接返回ch 公式———————————————————————————— 海倫公式:已知abc求三角形面積s p=(a+b+c)/2; s=sqrt(p*(p-a)*(p-b)*(p-c)); gcd: int gcd(int a,int b) { int t; if(a<b) return gcd(b,a); while(b) { t=b; b=a%b; a=t; } return a; } union(並查集) int find(int x) { if(pre[x]==x) return x; return pre[x]=find(pre[x]); } stl容器手冊—————————————————————————— 注://符號表示不常用。 · stringstream name(st) (sstream) 神一般的操作 將字串st轉化為輸入流,可以用來name>>str. · vector<int>name(n,v) 變數name是一個vector,每個元素為int,初始化為n個元素,值均為v. + 資料結構為最簡單的一維陣列。 + 運算子:可以直接使用[]訪問元素。 + 建構函式: 可以不初始化 vector(n) vector(n,v) + 方法: empty()判斷是否為空 //at() 返回指定位置的元素(直接[]就好了嘛) size() 返回Vector元素數量 clear() 清空所有元素 erase() 刪除指定元素 insert() 插入元素到Vector中 pop_back() 移除最後一個元素 push_back() 在Vector最後新增一個元素 begin(),end(),左閉右開,頭尾iterator,有時可替代指標。eg.sort(v.begin(),v.end()) pop_back()出棧,用於從vector末尾刪除元素與push_back()相反 //size_typezise()返回當前vector中的實際的元素個數 //size_typemax_size()返回標準庫給vector允許分配的最大元素個數 //size_typecapacity()返回當前可容納的vector元素的個數 //referencefront()返回當前vector首元素的引用,要求vector非空 eg.與front()的區別為const,我也不清 //referenceback()返回當前vector末尾元素的引用,要求vector非空 eg.與end()的區別為const,我也不清 ·注:vector沒有push_front()和pop_front()要在任意位置插入元素用insert(iterator pos,int a)在pos前插入a。 刪除指定元素用erase(iteratorpos),刪除指定區間的元素用 erase(iterator first,iterator last)刪除[first,last)區間的元素。 Clear呼叫erase()刪除[begin(),end())之間的所有元素,即清空vector · set<string>name 變數name是一個型別為string的集合,即所有元素最多出現一次。且自動按<號排序 + 資料結構為紅黑樹。以節點形式儲存(動態),進行操作後原有的iterator指向的內容不變。 + 運算子:不可以引用[]。需要用迭代器iterator訪問。 + 建構函式: insert() ,插入一個值 begin() end() ,左閉右開,頭尾iterator clear() ,刪除set容器中的所有的元素 empty() ,判斷set容器是否為空 size() ,返回當前set容器中的元素個數 //max_size() ,返回set容器可能包含的元素最大個數 count() 用來查詢set中某個某個鍵值出現的次數,鍵值在set只可能出現0或1次,這樣就變成了判斷某一鍵值是否在set出現過了 //equal_range() lower_bound(key_value) ,返回第一個大於等於key_value的定位器(iterator) upper_bound(key_value),返回最後一個大於等於key_value的定位器(iterator) · map<string,int>name 變數name是一個從string到int的一個對映。 + 資料結構為紅黑樹。 + 運算子:[]已被過載,可以用name["wbt"]=161082賦值(若"wbt"已經存在,則修改其值,不存在則insert) + 建構函式: insert(pair<string,int>("aclive",102))插入一對值,跟[]不同的是,此處要涉及到集合中元素唯一性,即"aclive"存在時插入失敗 跟set有點類似。 · queue<type>q; 申請一個type型別的佇列 queue 的基本操作有: 入隊,如例:q.push(x); 將x 接到佇列的末端。 出隊,如例:q.pop(); 彈出佇列的第一個元素,注意,並不會返回被彈出元素的值。 訪問隊首元素,如例:q.front(),即最早被壓入佇列的元素。 訪問隊尾元素,如例:q.back(),即最後被壓入佇列的元素。 判斷佇列空,如例:q.empty(),當佇列空時,返回true。 訪問佇列中的元素個數,如例:q.size() · stack<type> empty(判斷是否為空) size (返回棧的元素個數) top(返回棧頂元素) push_back (入棧) pop_back (出棧) stl函式手冊—————————————————————— <algorithm> · int a[n]; - int* lower_bound(a,a+n,x); 從陣列a,查詢n個元素(第a[n]不找)。二分查詢第一個 小於等於 <= x的位置,要求<號必須定義過,且a升序。 若陣列全都小於x,則返回 地址a+n。 ·- int* upper_bound(int* a,int* a+n,int x) 跟lower_bound類似,唯一區別就是 查詢的是第一個 小於 < x的位置 ·- sort(a,a+n,cmp) 第三個引數可以省略,即升序。(我覺得也可以定義小於號) cmp函式: bool cmp(int a,int b) { return a<b; //從小到大 } ·- bool next_permutation(a,a+n) 求a地址開始n個元素的下一個全排列,其中123是第一個全排列,321是最後一個,若a中元素已經是最後一個321, 則結果是第一個全排列123並返回false,其餘情況返回true。 a陣列可以為char,也可以為int。 ·- bool prev_permutation(a,a+n) 求上一個全排列 和next_permutation類似, <stdlib.h> / <cstdlib> ·- qsort(array,n,sizeof(int),comp) comp函式: int comp(const void*a,const void*b) { return *(int*)a-*(int*)b;//從小到大 } ·- sort(front ,end,cmp) front 和end為指標或迭代器,劃定排序陣列和區間[front,end),cmp可以預設,表示排序比較函式,格式為: bool cmp(node a,node b)//node為結構體/類 { return a.x<b.x;//按照x成員從小到大排序。 } <string> ·- int string.find(char/string s1,int i) 查詢s中第i個位置(包括i)第一次出現s1相對與string的位置(i到結尾),並返回(包括0) - s.rfind(s1,i) (倒著查詢,0到i的位置(i到結尾)(包括i),同上) - s.replace(pos, n, s1) 用s1替換s中從pos開始(包括0)的共n個字元的子串,可與find搭配。 <ctype.h>/<cctype> · int(or bool) isalpha(char ch) 一種函式:判斷字元ch是否為英文字母,若為英文字母,返回非0(小寫字母為2,大寫字母為1)。若不是字母,返回0。 在標準c中相當於使用“ isupper( ch ) || islower( ch ) ”做測試, · isupper/islower 此為巨集定義,非真正函式。 · tolower(char ch)/toupper(char ch) 若ch為小寫字母,則將ch轉換為大寫字母返回,若為大寫字母或其他字元,直接返回ch