C++ STL multiset容器基本使用

总时间限制: 

5000ms

内存限制: 

100000kB

描述

现有一整数集(允许有重复元素),初始为空。我们定义如下操作:
add x 把x加入集合
del x 把集合中所有与x相等的元素删除
ask x 对集合中元素x的情况询问
对每种操作,我们要求进行如下输出。
add 输出操作后集合中x的个数
del 输出操作前集合中x的个数
ask 先输出0或1表示x是否曾被加入集合(0表示不曾加入),再输出当前集合中x的个数,中间用空格格开。

输入

第一行是一个整数n,表示命令数。0<=n<=100000。
后面n行命令,如Description中所述。

输出

共n行,每行按要求输出。

样例输入

7
add 1
add 1
ask 1
ask 2
del 2
del 1
ask 1

样例输出

1
2
1 2
0 0
0
2
1 0

multiset 类会将重复元素也计入其中,而set中没有相同元素,使用multiset中的count函数可以查询一个元素出现的次数。

erase(n)会删去multiset中所有与n相同的元素。

这道题目要查询元素是否被加入到容器,所以除了一个multiset容器外,还要使用一个set容器

#include 
#include 
#include 

using namespace std;

int main()
{
	// 这里用两个容器,是因为要查询元素是否曾加入过集合
	multiset mset;
	set mm;
	char commend[5];
	int i, n, num;
	cin >> n;
	for (i = 0; i < n; i++)
	{
		cin >> commend >> num;
		switch (commend[1])        // 判断命令的第二个字母
		{
		case 'd':                  // add 
			mset.insert(num);      // 将num加入集合
			mm.insert(num);
			cout << mset.count(num) << endl;   //输出操作后集合中x的个数
			break;
		case 'e':                              // del
			cout << mset.count(num) << endl;   // 输出操作前集合中x的个数
			mset.erase(num);                   // 把集合中所有与x相等的元素删除
			break;
		case 's':                              // ask
			if (mm.find(num) == mm.end())
				cout << "0 0" << endl;         // 先输出0或1表示x是否曾被加入集合(0表示不曾加入),
			                                   // 再输出当前集合中x的个数,中间用空格格开。
			else
			{
				cout << "1 ";                     // 集合曾加入了集合
				cout << mset.count(num) << endl;  // 输出集合中的个数
			}
			break;
		}
	}
	return 0;
}

 

你可能感兴趣的:(算法)