ID:7302模板库应用2-模板题3-题解

ID:7302模板库应用2-模板题3-题解
题目描述:
现在有10个集合(元素不可重),编号为0~9,现在有6种操作:
给一个集合x插入一个数y。
给一个集合x删除一个数y(如果没有就不删)。
给两个集合x,y,将集合x=x∪y(集合求并),并将y清空。
给两个集合x,y,将集合x=x∩y(集合求交),并将y清空。
给一个集合x和一个数y,询问集合x中是否出现了y。
给一个集合x,问集合x中有多少个数。
不保证所有数不相同。

思路: 直接用STL里的set集合去写
0.定义:有10个set,所以要定义10个
set s[10], c;//c之后要用

  1. 给一个集合x插入一个数y:直接添加
    if (op == 1)
	{
		cin >> x >> y;
		s[x].insert(y);
	}
  1. 给一个集合x删除一个数y(如果没有就不删):先判断有没有(用了find()),再删除
	if (op == 2)
	{
		cin >> x >> y;
		if (s[x].find(y) != s[x].end())
		{
			s[x].erase(s[x].find(y));
		}
	}
  1. 给两个集合x,y,将集合x=x∪y(集合求并),并将y清空:用并集函数set_union()
    if (op == 3)
	{
		cin >> x >> y;
		c.clear();
		set_union(s[x].begin(), s[x].end(), s[y].begin(), s[y].end(), inserter(c, c.begin()));//c在这里!
		s[x] = c;
		s[y].clear();
	}
  1. 给两个集合x,y,将集合x=x∩y(集合求交),并将y清空:用交集函数set_intersection()
if (op == 4)
	{
	cin >> x >> y;
	c.clear();
	set_intersection(s[x].begin(), s[x].end(), s[y].begin(), s[y].end(), inserter(c, c.begin()));
		s[x] = c;
		s[y].clear(); 
	}
  1. 给一个集合x和一个数y,询问集合x中是否出现了y:用计数函数count()
	if (op == 5)
	{
		cin >> x >> y;
		if (s[x].count(y))
		{
			cout << "Yes" << endl;
		}
		else
		{
			cout << "No" << endl;
		}
  1. 给一个集合x,问集合x中有多少个数:用大小size()
if (op == 6)
	{
		cin >> x;
		cout << s[x].size() << endl;
	}
3 个赞