C/C++之set

set常用方法

函數名 解釋
begin 返回容器的起始迭代器
end 返回結束迭代器
count 返回某元素的個數
erase 刪除集合某個元素
find 返回被查找元素的迭代器
insert 向容器中插入元素
size 返回容器元素的個數
max_size 返回當前set容器可存元素的個數
lower_bound 返回第一個大於或等於的元素
upper_bound 返回第一個大於的元素

multiset

函數名 解釋
begin 返回容器的起始迭代器
end 返回結束迭代器
count 返回某元素的個數
erase 刪除集合某個元素
find 返回被查找元素的迭代器
insert 向容器中插入元素
size 返回容器元素的個數

合法字符

遞歸形式

#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
set<string> parenthesis(int n)
{
	set<string> s_n;
	if(n==1)
	{
		s_n.insert("()");
		return s_n;
	 } 
	 set<string> s_n_1=parenthesis(n-1);
	 for(set<string>::iterator it=s_n_1.begin();it!=s_n_1.end();it++)
	 {
	 	s_n.insert("()"+*it);
	 	s_n.insert(*it+"()");
	 	s_n.insert("("+*it+")");
	 }
	 return s_n;
}
int main()
{
	int n;
	cin>>n;
	set<string> s=parenthesis(n);
	for(set<string>::iterator it=s.begin();it!=s.end();it++)
	{
		cout<<*it<<endl;
	}
	return 0;
}

迭代形式

#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
set<string> parenthesis(int n)
{
	set<string> res;
	res.insert("()");
	for(int i=2;i<=n;i++)
	{
		set<string> new_res;
		for(set<string>::iterator it=res.begin();it!=res.end();it++)
		{
			new_res.insert("()"+*it);
			new_res.insert(*it+"()");
			new_res.insert("("+*it+")");
		}
		res=new_res;
	}
	return res;
}
int main()
{
	int n;
	cin>>n;
	set<string> s=parenthesis(n);
	for(set<string>::iterator it=s.begin();it!=s.end();it++)
	{
		cout<<*it<<endl;
	}
	return 0;
}

子集生成

遞歸

#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
int arr[]={1,2,3};
set<set<int> > getSubsets(int n,int cur)
{
	set<set<int> > newSet;
	if(cur==0)
	{
		set<int> nil;
		set<int> first;
		first.insert(arr[0]);
		newSet.insert(nil);
		newSet.insert(first);
		return newSet;
	}
	set<set<int> > oldSet=getSubsets(n,cur-1);
	for(set<set<int> >::iterator it=oldSet.begin();it!=oldSet.end();it++)
	{
		newSet.insert(*it);
		set<int> s(*it);
		s.insert(arr[cur]);
		newSet.insert(s);
	}
	return newSet;
}
int main()
{
	set<set<int> > s=getSubsets(2,3);
	for(set<set<int> >::iterator it=s.begin();it!=s.end();it++)
	{
		if((*it).size()==0)
			continue;
		for(set<int>::iterator iit=(*it).begin();iit!=(*it).end();iit++)
			cout<<*iit<<" ";
		cout<<endl;
	}
	return 0;
}

迭代

#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
int arr[]={1,2,3,4,5,6,7,8,9};
set<set<int> > getSubsets(int n)
{
	set<set<int> > res;
	set<int> s;
	res.insert(s);//將空的加入
	for(int i=0;i<n;i++)
	{
		set<set<int> > res_new(res);
		for(set<set<int> >::iterator it=res.begin();it!=res.end();it++)
		{
			set<int> s(*it);
			s.insert(arr[i]);
			res_new.insert(s);
		}
		res=res_new;
	 } 
	return res;
}
int main()
{
	set<set<int> > s=getSubsets(9);
	for(set<set<int> >::iterator it=s.begin();it!=s.end();it++)
	{
		if((*it).size()==0)
			continue;
		for(set<int>::iterator iit=(*it).begin();iit!=(*it).end();iit++)
			cout<<*iit<<" ";
		cout<<endl;
	}
	return 0;
}

list解決方法

#include<iostream>
#include<algorithm>
#include<list>
#include<math.h>
using namespace std;
int arr[]={1,2,3,4,5,6,7,8,9};
list<list<int> > getSubsets(int n)
{
	list<list<int > > res;
	for(int i=pow(2,n)-1;i>0;i--)
	{
		list<int> s;
		for(int j=n-1;j>=0;j--)
		{
			if(((i>>j)&1)==1)
			{	
				s.push_back(arr[j]);
			}
		}
		s.sort(); 
		res.push_back(s);			
	 } 
	return res;
}
int main()
{
	list<list<int> > l=getSubsets(3);
	l.sort();
	for(list<list<int> >::iterator it=l.begin();it!=l.end();it++)
	{
		for(list<int>::iterator mit=(*it).begin();mit!=(*it).end();mit++)
		{
			cout<<*mit<<" ";
		}
		cout<<endl;
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章