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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值