模板(acm)

加權並查集:
// http://poj.org/problem?id=1182
#include<stdio.h>

struct node
{
	int p;
	int r;
}a[50005];

int find(int x)
{
	if(x==a[x].p) return x;
	
	int t=a[x].p;
	a[x].p=find(t);
	a[x].r=(a[x].r+a[t].r)%3;
	return a[x].p;
}

int main()
{
	int N,k;
	scanf("%d%d",&N,&k);
	
	int i,j,d,x,y,ans=0;
	
	for(i=1;i<=N;i++)
	{
		a[i].p=i;
		a[i].r=0;
	}
	
	for(i=0;i<k;i++)
	{
		scanf("%d%d%d",&d,&x,&y);
		if(x>N||y>N) ans++;
		else
		{
			if(d==2&&x==y) ans++;
			else
			{
				int c=find(x);
				int b=find(y);
				
				if(c!=b)
				{
					a[b].p=c;
					a[b].r=(3+d-1+a[x].r-a[y].r)%3; 
				}
				else
				{
					if(d==2&&((3-a[x].r+a[y].r)%3!=d-1)) ans++;
					if(d==1&&a[x].r!=a[y].r) ans++;
				}
			}
		}
	}
	printf("%d\n",ans);
	
	return 0;
}





線段樹(單點更新,區間求和)
//http://acm.hdu.edu.cn/showproblem.php?pid=1754
#include<stdio.h>
#include<algorithm>
#include<math.h>

using namespace std;

const int N=200000+5;

struct Node
{
	int left,right;
	int value;
};

Node tree[N<<2];
int father[N<<2];

void BuiltTree(int l,int r,int i)
{
	tree[i].value=0;
	tree[i].right=r;
	tree[i].left=l;
	
	if(l==r)
	{
		father[l]=i;
	//	printf("f %d %d %d\n",father[l],i,l);
		return ;
	}
	BuiltTree(l,(int)(floor)(l+r)/2,i<<1);
	BuiltTree((int)(floor)(l+r)/2+1,r,(i<<1)+1);
}

void Update(int i)
{
	i>>=1;
	if(i==0) return ;
	tree[i].value=max(tree[i<<1].value,tree[(i<<1)+1].value);
//	printf("%d %d %d %d\n",i,tree[i].value,tree[i<<1].value,tree[(i<<1)+1].value);
	Update(i);
}

int ans;

void query(int l,int r,int i)
{
	if(l==tree[i].left && r==tree[i].right)
	{
		ans=max(tree[i].value,ans);
		return ;
	}
	
	i<<=1;
	if(l<=tree[i].right)
	{
		if(r<=tree[i].right)
			query(l,r,i);
		else query(l,tree[i].right,i);
	}
	i++;
	if(r>=tree[i].left)
	{
		if(l>=tree[i].left) query(l,r,i);
		else query(tree[i].left,r,i);
	}
}

int main()
{
	int n,m;
	
	while(~scanf("%d%d",&n,&m))
	{
		BuiltTree(1,n,1);
		int i=1;
		while(i<=n)
		{
			scanf("%d",&tree[father[i]].value);
			Update(father[i]);
		//	printf("%d \n",tree[father[i]].value);
			i++;
		}
		while(m--)
		{
			char a[2];
			int v;
			scanf("%s%d%d",a,&i,&v);//printf("%c %d\n",a[0],father[i]);
			if(a[0]=='U')
			{
			//	printf("v%d %d\n",father[i],tree[father[i]].value);
				tree[father[i]].value=v;
			//	printf("v%d %d\n",father[i],tree[father[i]].value);
				Update(father[i]);
			}
			else
			{
				ans=0;
				query(i,v,1);
				printf("%d\n",ans);
			}
		}
	}
	
	return 0;
}

區間線段樹(區間修改,區間求和)
// http://poj.org/problem?id=3468
#include<stdio.h>
#define ll long long
const int N=100000;

struct Node
{
	int l,r;
	
	int mid()
	{
		return (l+r)>>1;
	}
}tree[N<<2];

ll sum[N<<2],add[N<<2];

void pushup(int i){sum[i]=sum[i<<1]+sum[i<<1|1];}

void pushdown(int i,int m)
{
	if(add[i])
	{
		add[i<<1]+=add[i];
		add[i<<1|1]+=add[i];
		sum[i<<1]+=add[i]*(m-(m>>1));
		sum[i<<1|1]+=add[i]*(m>>1);
		add[i]=0;
	}
}

void buildtree(int l,int r,int i)
{
	tree[i].l=l;
	tree[i].r=r;
	add[i]=0;

	if(l==r)
	{
		scanf("%lld",&sum[i]);
	//	printf("%d %d %d\n",i,sum[i],l);
		return ;
	}

	int m=tree[i].mid();
	buildtree(l,m,i<<1);
	buildtree(m+1,r,i<<1|1);
	pushup(i);
}

void update(int l,int r,int i,ll w)
{
	if(tree[i].l==l&&tree[i].r==r)
	{
		sum[i]+=(ll)w*(tree[i].r-tree[i].l+1);
		add[i]+=w;
		return ;
	}
	if(tree[i].l==tree[i].r) return ;
	pushdown(i,tree[i].r+1-tree[i].l);
	
	int m=tree[i].mid();
	if(l>m) update(l,r,i<<1|1,w);
	else if(r<=m) update(l,r,i<<1,w);
	else
	{
		update(l,m,i<<1,w);
		update(m+1,r,i<<1|1,w);
	}
	pushup(i);
}

ll ans;
ll query(int l,int r,int i)
{
	if(tree[i].l==l&&tree[i].r==r)
	{
		return sum[i]+ans;
	}

	pushdown(i,tree[i].r+1-tree[i].l); 
	int m=tree[i].mid();
	if(l>m) ans=query(l,r,i<<1|1);
	else if(r<=m) ans=query(l,r,i<<1);
	else
	{
		ans=query(l,m,i<<1);
		ans=query(m+1,r,i<<1|1);
	}

	return ans;
}

int main()
{
	int n,q,l,r,w;
	
	scanf("%d%d",&n,&q);
	buildtree(1,n,1);

	while(q--)
	{
		char a[2];
		getchar();
		scanf("%s",a);
		if(a[0]=='Q')
		{
			scanf("%d%d",&l,&r);
			ans=0;
			printf("%lld\n",query(l,r,1));
		}
		else
		{
			scanf("%d%d%d",&l,&r,&w);
			update(l,r,1,w);
		}
	}
	
	return 0;
}








STL
一.Algorithm

給定一個vector容器:vector<int> nums={8,7,5,4,2,9,6,1,3,0};
find:find(nums.begin(),nums.end(),4); 
find the number 4 ,return the iterator of the number。 
返回第一次出現4的位置的迭代器(可以理解爲指針,但不同。) 
想要得到4所在位置的下標,可以寫作 
find(nums.begin(),nums.end(),4)-nums.begin(); 
注:若未找到則返回nums.end()

swap:swap(nums[0],nums[2]); 
交換nums中下標爲0和下標爲2的元素。
for_each:for_each(nums.begin(),nums.end(),[](int n){cout<<n<<" ";}); 
此函數可以對參數1到參數2範圍內的元素執行參數3函數內容。 
以上語句可以把nums內所有元素執行cout並輸出一個空格。
用例:
#include <iostream> #include <vector> #include <algorithm> 
using namespace std; 
int main() 
{
vector<int>nums={8,7,5,4,2,9,6,1,3,0}; 	cout<<find(nums.begin(),nums.end(),4)-nums.begin()<<endl;//find the number 4 return the iterator of the number 
swap(nums[0],nums[2]); 
for_each(nums.begin(),nums.end(),[](int n){cout<<n<<" ";}); 	cout<<endl; 
sort(nums.begin(),nums.end(),[](int n1,int n2){return n1>n2;}); 	for_each(nums.begin(),nums.end(),[](int n){cout<<n<<" ";}); 
return 0; 
}
結果:
3
5 7 8 4 2 9 6 1 3 0
9 8 7 6 5 4 3 2 1 0

algorithm庫函數集合:
adjacent_find	在一個數組中尋找兩個相鄰的元素。如果相等,就返回這兩個相等元素第一個元素的迭代器,不等的話,就返回v.end().  vector<int>::iterator it;  it=adjacent_find(nums.begin(),nums.end() );
all_of C++11	檢測在給定範圍中是否所有元素都滿足給定的條件bool flag= std::all_of(nums.begin(), nums.end(),[](int i);

any_of C++11	檢測在給定範圍中是否存在元素滿足給定條件
count	返回值等價於給定值的元素的個數
count_if	返回值滿足給定條件的元素的個數
equal	返回兩個範圍是否相等
find	返回第一個值等價於給定值的元素
find_end	查找範圍A中與範圍B等價的子範圍最後出現的位置
find_first_of	查找範圍A中第一個與範圍B中任一元素等價的元素的位置
find_if	返回第一個值滿足給定條件的元素
find_if_notC++11	返回第一個值不滿足給定條件的元素
for_each	對範圍中的每個元素調用指定函數
mismatch	返回兩個範圍中第一個元素不等價的位置
none_ofC++11	檢測在給定範圍中是否不存在元素滿足給定的條件
search	在範圍A中查找第一個與範圍B等價的子範圍的位置
search_n	在給定範圍中查找第一個連續n個元素都等價於給定值的子範圍的位置
修改內容的序列操作:
copy	將一個範圍中的元素拷貝到新的位置處
copy_backward	將一個範圍中的元素按逆序拷貝到新的位置處
copy_ifC++11	將一個範圍中滿足給定條件的元素拷貝到新的位置處
copy_nC++11	拷貝 n 個元素到新的位置處
fill	將一個範圍的元素賦值爲給定值
fill_n	將某個位置開始的 n 個元素賦值爲給定值
generate	將一個函數的執行結果保存到指定範圍的元素中,用於批量賦值範圍中的元素
generate_n	將一個函數的執行結果保存到指定位置開始的 n 個元素中
iter_swap	交換兩個迭代器(Iterator)指向的元素
moveC++11	將一個範圍中的元素移動到新的位置處
move_backwardC++11	將一個範圍中的元素按逆序移動到新的位置處
random_shuffle	隨機打亂指定範圍中的元素的位置
remove	將一個範圍中值等價於給定值的元素刪除
remove_if	將一個範圍中值滿足給定條件的元素刪除
remove_copy	拷貝一個範圍的元素,將其中值等價於給定值的元素刪除
remove_copy_if	拷貝一個範圍的元素,將其中值滿足給定條件的元素刪除
replace	將一個範圍中值等價於給定值的元素賦值爲新的值
replace_copy	拷貝一個範圍的元素,將其中值等價於給定值的元素賦值爲新的值
replace_copy_if	拷貝一個範圍的元素,將其中值滿足給定條件的元素賦值爲新的值
replace_if	將一個範圍中值滿足給定條件的元素賦值爲新的值
reverse	反轉排序指定範圍中的元素
reverse_copy	拷貝指定範圍的反轉排序結果
rotate	循環移動指定範圍中的元素
rotate_copy	拷貝指定範圍的循環移動結果
shuffleC++11	用指定的隨機數引擎隨機打亂指定範圍中的元素的位置
swap	交換兩個對象的值
swap_ranges	交換兩個範圍的元素
transform	對指定範圍中的每個元素調用某個函數以改變元素的值
unique	刪除指定範圍中的所有連續重複元素,僅僅留下每組等值元素中的第一個元素。
unique_copy	拷貝指定範圍的唯一化(參考上述的 unique)結果
劃分操作:
is_partitionedC++11	檢測某個範圍是否按指定謂詞(Predicate)劃分過
partition	將某個範圍劃分爲兩組
partition_copyC++11	拷貝指定範圍的劃分結果
partition_pointC++11	返回被劃分範圍的劃分點
stable_partition	穩定劃分,兩組元素各維持相對順序
排序操作:
is_sortedC++11	檢測指定範圍是否已排序
is_sorted_untilC++11	返回最大已排序子範圍
nth_element	部份排序指定範圍中的元素,使得範圍按給定位置處的元素劃分
partial_sort	部份排序
partial_sort_copy	拷貝部分排序的結果
sort	排序
stable_sort	穩定排序
二分法查找操作:
binary_search	判斷範圍中是否存在值等價於給定值的元素
equal_range	返回範圍中值等於給定值的元素組成的子範圍
lower_bound	返回指向範圍中第一個值大於或等於給定值的元素的迭代器
upper_bound	返回指向範圍中第一個值大於給定值的元素的迭代器
集合操作:
includes	判斷一個集合是否是另一個集合的子集
inplace_merge	就緒合併
merge	合併
set_difference	獲得兩個集合的差集
set_intersection	獲得兩個集合的交集
set_symmetric_difference	獲得兩個集合的對稱差
set_union	獲得兩個集合的並集

堆操作:
is_heap	檢測給定範圍是否滿足堆結構
is_heap_untilC++11	檢測給定範圍中滿足堆結構的最大子範圍
make_heap	用給定範圍構造出一個堆
pop_heap	從一個堆中刪除最大的元素
push_heap	向堆中增加一個元素
sort_heap	將滿足堆結構的範圍排序
最大/最小操作:
is_permutationC++11	判斷一個序列是否是另一個序列的一種排序
lexicographical_compare	比較兩個序列的字典序
max	返回兩個元素中值最大的元素
max_element	返回給定範圍中值最大的元素
min	返回兩個元素中值最小的元素
min_element	返回給定範圍中值最小的元素
minmaxC++11	返回兩個元素中值最大及最小的元素
minmax_elementC++11	返回給定範圍中值最大及最小的元素
next_permutation	返回給定範圍中的元素組成的下一個按字典序的排列
prev_permutation	返回給定範圍中的元素組成的上一個按字典序的排列




Vector
初始化:
(1) vector<int> a(10); //定義了10個整型元素的向量(尖括號中爲元素類型名,它可以是任何合法的數據類型),但沒有給出初值,其值是不確定的。
   (2)vector<int> a(10,1); //定義了10個整型元素的向量,且給出每個元素的初值爲1
   (3)vector<int> a(b); //用b向量來創建a向量,整體複製性賦值
   (4)vector<int> a(b.begin(),b.begin+3); //定義了a值爲b中第0個到第2個(共3個)元素
   (5)int b[7]={1,2,3,4,5,9,8};
        vector<int> a(b,b+7); 或者vector<int> a(b,&b[7])//從數組中獲得初值;

函數:
(1)a.assign(b.begin(), b.begin()+3); //b爲向量,將b的0~2個元素構成的向量賦給a
    (2)a.assign(4,2); //是a只含4個元素,且每個元素爲2
    (3)a.back(); //返回a的最後一個元素
    (4)a.front(); //返回a的第一個元素
    (5)a[i]; //返回a的第i個元素,當且僅當a[i]存在2013-12-07
    (6)a.clear(); //清空a中的元素
    (7)a.empty(); //判斷a是否爲空,空則返回ture,不空則返回false
    (8)a.pop_back(); //刪除a向量的最後一個元素
    (9)a.erase(a.begin()+1,a.begin()+3); //刪除a中第1個(從第0個算起)到第2個元素,也就是說刪除的元素從a.begin()+1算起(包括它)一直到a.begin()+         3(不包括它)
    (10)a.push_back(5); //在a的最後一個向量後插入一個元素,其值爲5
    (11)a.insert(a.begin()+1,5); //在a的第1個元素(從第0個算起)的位置插入數值5,如a爲1,2,3,4,插入元素後爲1,5,2,3,4
    (12)a.insert(a.begin()+1,3,5); //在a的第1個元素(從第0個算起)的位置插入3個數,其值都爲5
    (13)a.insert(a.begin()+1,b+3,b+6); //b爲數組,在a的第1個元素(從第0個算起)的位置插入b的第3個元素到第5個元素(不包括b+6),如b爲1,2,3,4,5,9,8         ,插入元素後爲1,4,5,9,2,3,4,5,9,8
    (14)a.size(); //返回a中元素的個數;
    (15)a.capacity(); //返回a在內存中總共可以容納的元素個數
    (16)a.resize(10); //將a的現有元素個數調至10個,多則刪,少則補,其值隨機
    (17)a.resize(10,2); //將a的現有元素個數調至10個,多則刪,少則補,其值爲2
    (18)a.reserve(100); //將a的容量(capacity)擴充至100,也就是說現在測試a.capacity();的時候返回值是100.這種操作只有在需要給a添加大量數據的時候才         顯得有意義,因爲這將避免內存多次容量擴充操作(當a的容量不足時電腦會自動擴容,當然這必然降低性能) 
    (19)a.swap(b); //b爲向量,將a中的元素和b中的元素進行整體性交換
    (20)a==b; //b爲向量,向量的比較操作還有!=,>=,<=,>,<

訪問vector的特殊方法
從現有向量中選擇元素向向量中添加:
int a[6]={1,2,3,4,5,6};
vector<int> b;
vector<int> c(a,a+4);for(vector<int>::iterator it=c.begin();it<c.end();it++)
b.push_back(*it);

從文件中讀取元素向向量中添加:
ifstream in("data.txt");
vector<int> a;for(int i; in>>i)
    a.push_back(i);

從向量中讀取元素得方法:
int a[6]={1,2,3,4,5,6};
vector<int> b(a,a+4);for(int i=0;i<=b.size()-1;i++)
cout<<b[i]<<" ";

通過遍歷器方式讀取:
int a[6]={1,2,3,4,5,6};
vector<int> b(a,a+4);for(vector<int>::iterator it=b.begin();it!=b.end();it++)
    cout<<*it<<" ";

Vector的幾種重要算法
1.
(1)sort(a.begin(),a.end()); //對a中的從a.begin()(包括它)到a.end()(不包括它)的元素進行從小到大排列
(2)reverse(a.begin(),a.end()); //對a中的從a.begin()(包括它)到a.end()(不包括它)的元素倒置,但不排列,如a中元素爲1,3,2,4,倒置後爲4,2,3,1
(3)copy(a.begin(),a.end(),b.begin()+1); //把a中的從a.begin()(包括它)到a.end()(不包括它)的元素複製到b中,從b.begin()+1的位置(包括它)開        始複製,覆蓋掉原有元素
(4)find(a.begin(),a.end(),10); //在a中的從a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置

2.(使用時注意)
vector<int>::iterator it;//迭代器 
	int i;
初始化:	
	vector<int>v1;        //定義空的vector
    vector<int>v2(10);    //產生大小爲10的vector
    vector<int>v3(10,-1);    //產生大小爲10,並且每個元素都是-1的vector
    vector<int>v4(v3);        //用一個vector產生一個vecotr
	
	int arr[5]={1,2,3,4,5};
    vector<int>v5(arr,&arr[5]);    //以區間[beg;end)做爲初值的vector
    cout<<v5.size()<<endl;
 
賦值   
	v1.assign(arr,arr+3);//將arr中的前三個元素賦給v1; 
	vector<int>a;
	vector<int>b; 
	a.assign(4,2);//a只包含4個元素,且每個元素都爲2;
	cout<<endl;
	
遍歷:	for(i=0;i<a.size();i++) printf("%d ",a[i]);cout<<endl;
	
	int v=a.back(); //返回a中最後一個元素;
	v=a.front();// 返回a的第一個元素;
    i=1;v=a[i]; //返回a的第i個元素,當且僅當
    
清空    a.clear();//清空a;
判斷是否爲空	if(a.empty()) printf("a is empty\n");
	if(!a.empty()) a.pop_back();//刪除a中最後一個元素
	
插入
	a.push_back(10); 
	v=a.front();//front前最好加個a.empty()判斷一下!!! 

大小
    vector<int>::size_type n=a.size();//Returns the number of elements in the vector.Member type size_type is an unsigned integral type.
    cout<<"a.size:"<<a.size()<<endl;//size:返回a向量的元素的個數 

刪除: 
   a.erase(a.begin()+1,a.begin()+3);//刪除a中第1個(從第0個算起)到第2個元素,也就是說刪除的元素從a.begin()+1 算起(包括它)
	//一直到a.begin()+3(不包括它)
	printf("a.size:%d\n",a.size());
	//vector.erase(a.begin(),a.begin()+3)要求a中必須至少有a.begin()+3-a.begin()個元素 

插入
	it=a.begin();
    it=a.insert(it,3);//在a中的it位置插入3個4,it爲迭代器; 
    printf("inset:%d\n",*it);
	for(it=a.begin();it!=a.end();++it) printf("%d ",*it);
    it=find(a.begin(),a.end(),10);//查找a中某一段區間,如果找到了則輸出這個地址,否則爲0; 
    printf("\n%d\n",*it);
    printf("%d %d\n",a.capacity(),a.size()); //a.capacity:返回a在內存中總共可以容納的元素個數,a.size():

Resize	
	a.resize(10);//將a的現有元素個數調至10個,多則刪,少則補,其值隨機
	a.resize(10,2);//將a的現有元素個數調至10個,多則刪,少則補,其值爲2
	a.reserve(100);// 將a的容量(capacity)擴充至100,也就是說現在測試a.capacity();的時候返回值是100.這種操作只有在需要給a添加大量數據的時候才         顯得有意義,因爲這將避免內存多次容量擴充操作(當a的容量不足時電腦會自動擴容,當然這必然降低性能) 

交換	a.swap(b); //b爲向量,將a中的元素和b中的元素進行整體性交換

a在內存中的容量    printf("%d\n",a.capacity()); 
    
    //其他重要算法(需要頭文件algorithm) 
	sort(a.begin(),a.end(),cmp);//cmp決定sort的升降序 

	reverse(a.begin(),a.end());//對a中的從a.begin()(包括它)到a.end()(不包括它)的元素倒置,但不排列,如a中元素爲1,3,2,4,倒置後爲4,2,3,1

	copy(a.begin(),a.end(),b.begin()+1);//把a中的從a.begin()(包括它)到a.end()(不包括它)的元素複製到b中,從b.begin()+1的位置(包括它)開        始複製,覆蓋掉原有元素
	


List
List定義和初始化:
list<int>lst1;          //創建空list
list<int> lst2(5);       //創建含有5個元素的list
list<int>lst3(3,2);  //創建含有3個元素的list
list<int>lst4(lst2);    //使用lst2初始化lst4
list<int>lst5(lst2.begin(),lst2.end());  //同lst4
操作函數

list<int>lst1;          //創建空list
    list<int> lst2(5);       //創建含有5個元素的list,每個元素都爲0 
    list<int>lst3(3,2);  //創建含有3個元素的list,每個元素都爲2 
    list<int>lst4(lst2);    //使用lst2初始化lst4
    list<int>lst5(lst2.begin(),lst2.end());  //聲明一個列表,其元素的初始值來源於由區間所指定的序列中的元素,
	
	list<int> a;
	list<int>::iterator it1,it2;
	
	賦值:
a.push_back(i);//push_back()是從list末端插入,而push_front是從頭部插入
b.賦值 :a.push_front(i);

	遍歷:
	for(it1=a.begin();it1!=a.end();++it1)
				printf("%d ",*it1);
			
	
a的大小 :	printf("\nsize:%d\n",a.size());// a的元素個數 
a的最大容量: 	cout<<a.max_size()<<endl;//返回a的最大元素數量 
	
	//調用resize(n)將list的長度改爲只容納n個元素,超出的元素將被刪除。
	//如果n比list原來的長度長,那麼默認超出的部分元素置爲0。
	//也可以用resize(n, m)的方式將超出的部分賦值爲m。

a.resize(10);//從新定義鏈表的長度,超出原始長度部分用0代替,小於原始部分刪除。
a.resize(20,1);//  從新定義鏈表的長度,超出原始長度部分用num代替。

a的頭部元素: 	printf("%d\n",a.front());
a的末段元素: 	printf("%d\n",a.back());
	
迭代器:
	list<int>::reverse_iterator it3;

雙向鏈表末段:	it3=a.rbegin();//返回逆向鏈表的第一個元素,即c鏈表的最後一個數據。
雙向鏈表的頭部: 	 it3=a.rend();//返回逆向鏈表的最後一個元素的下一個位置,即c鏈表的第一個數據再往前的位置。
	
	//使用pop_back()可以刪掉尾部第一個元素,pop_front()可以刪掉頭部第一個元素。注意:list必須不爲空,
	//如果當list爲空的時候調用pop_back()和pop_front()會使程序崩掉。
	//使用前最好先a.empty();
刪除:
 a.pop_back();
	 a.pop_front();
	
賦值:	
	a.assign(3,1);//將a變成元素個數爲3,值都爲1的list 
	list<int>b;
	b.assign(a.begin(),a.end());//將b初始化,且和a相同 ,a.begin()和a.end()只能能++或者--
	int ints[]={1,2,3,4};
	a.assign(ints,ints+4);//利用數組初始化a 
	
交換:
	a.swap(b);//交換兩個鏈表。a.swap(b)和swap(a, b),都可以完成a鏈表和b鏈表的交換。
	
轉置:	
	reverse(b.begin(),b.end());
	
Empty:
	if(a.empty()) {...;}
合併:
	a.merge(b,less<int>());//將b合併到a,less<int>()(默認):a在前,b在後,greater則相反
	//也可以用cmp ( bool mycomparison (double first, double second)
{ return ( int(first)<int(second) ); } )
	//使用splice()前搖先判斷b是否爲空 
	a.splice(a.end(),b);//a.end()是沒有元素,將b連接到a的a.end()位置 ,並釋放b 
	a.splice(it1,b,it2);//將b的it2位置上的元素連接到a的的it1,並釋放掉b的it2;
	a.splice(it1,b,b.begin(),b.end());//同上 

插入:	
//	a.insert(pos,num)      在pos位置插入元素num。
//	a.insert(pos,n,num)      在pos位置插入n個元素num。
//	a.insert(pos,beg,end)      在pos位置插入區間爲[beg,end)的元素。
//	c.erase(pos)    刪除pos位置的元素。

對迭代器的:
	advance(it1,4);//加減迭代器 ,n(4) = 0 不移動,n > 0 迭代器+n, n <0 迭代器-n。

	it2++;
刪除:	a.erase(it1);//刪除第5個元素(a從0開始) 

	it1=a.begin();
	it2=a.begin();
	advance(it1,4);
//	a.erase(it1);//刪除it1位置的元素 
//	因爲a.erase()是對地址進行操作,當執行這一步時,下面erase會爆炸 
	a.erase(++it2,it1);//刪除a中it2到it1-1之間的元素 
	
刪除:
	list<int>::iterator it=++a.begin();
	a.remove(1);// 刪除鏈表中匹配num的元素。
	a.remove_if(cmp_remove);//刪除條件滿足的元素,參數爲自定義的回調函數。
	for(it1=a.begin();it1!=a.end();++it1)
		printf("%d ",*it1);
	printf("\n");
	
去重
	for(int i=1;i<5;i++) a.push_back(0);
	a.unique();//刪除相鄰且重複的元素(保留一個) 
	for(it1=a.begin();it1!=a.end();++it1)
		printf("%d ",*it1);
	printf("\n");

排序
	a.sort(cmp);//排序b不能用sort(a.begin(),a.end()); 
	for(it1=a.begin();it1!=a.end();++it1)
		printf("%d ",*it1);
	printf("\n");
	
清空
	a.clear();//刪除鏈表中匹配num的元素。
	

Queue
	queue<int> a,b;
	//queue沒有迭代器!!!!!!!!! 
	
	插入 
	a.push(1);

	刪除
	a.pop();
	
	size 
	printf("%d\n",a.size());//返回值爲 unsigned int
queue<int>q;  //創建一個int型空隊列q
	q.empty();   //判斷隊列是否爲空,爲空返回true
	q.push(2);   //將變量s從隊尾入隊
	q.pop();      //將隊頭元素彈出
	q.front();  // 只返回隊頭元素
	q.back();   //只返回隊尾元素
	q.size();    // 返回隊列中元素個數
	
Deque
(頭文件deque)雙端隊列的操作  (可以在隊頭隊尾進行入隊出隊操作)
	//deque有迭代器!!! 
	deque<int> dq;   //創建一個數雙端隊列dq
	
	dq.empty();    //判斷隊列是否爲空,爲空返回true
	
	dq.push_front(3);   //將s從隊頭入隊
	deque<int>::iterator it;
	it=dq.begin();
	printf("%d\n",*it);
	dq.push_back(4);   //將s從隊尾入隊,和普通隊列方式一樣
	dq.front();    //只返回隊頭元素
	dq.back();    //只返回隊尾元素
	dq.pop_front();    //將隊頭元素彈出
	dq.pop_back();    //將隊尾元素彈出
	dq.clear();     //將隊列清空


雖然是自己寫的,但是都忘了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章