1. 程式人生 > >c++中acm常用stl和function等

c++中acm常用stl和function等

容器

注://符號表示不常用。
·	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