容器—set的基本用法以及实践

set就是集合,属于关联式容器,STL 对定义的通用容器分三类:顺序性容器、关联式容器和容器适配器。
顺序性容器 是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。这个位置和元素本身无关,而和操作的时间和地点有关,顺序性容器不会根据元素的特点排序而是直接保存了元素操作时的逻辑顺序。比如我们一次性对一个顺序性容器追加三个元素,这三个元素在容器中的相对位置和追加时的逻辑次序是一致的。

关联式容器 和顺序性容器不一样,关联式容器是非线性的树结构,更准确的说是二叉树结构。各元素之间没有严格的物理上的顺序关系,也就是说元素在容器中并没有保存元素置入容器时的逻辑顺序。但是关联式容器提供了另一种根据元素特点排序的功能,这样迭代器就能根据元素的特点“顺序地”获取元素。

因此set的内部是由二叉搜索树实现的,set、map它们的底层都是基于红黑树,集合中的元素不可重复,并且在存的时候会自动排序,查找的时间复杂度为log2(n),因此十分高效。

set在插入的时候比vector 快,但在查找和末尾添加上被vector 慢。

set的创建:

set<type> name; 

set的基本操作:

s.insert(n); //将n放进set里
s.erase(n); //将n从set里删除
s.clear(); //清空set
s.empty(); //检查是否为空,空则返回true
s.size(); //返回元素个数
s.find(n); //返回迭代器,指向键值n,迭代器可视为指针
s.lower_bownd(n); //返回迭代器,键值不小于n的第一个元素
s.upper_bownd(n); //返回迭代器,键值不大于n的第一个元素

题目实践

产生冠军
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 30957 Accepted Submission(s): 13941

Problem Description
有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛。
球赛的规则如下:
如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C。
如果A打败了B,B又打败了C,而且,C又打败了A,那么A、B、C三者都不可能成为冠军。
根据这个规则,无需循环较量,或许就能确定冠军。你的任务就是面对一群比赛选手,在经过了若干场撕杀之后,确定是否已经实际上产生了冠军。

Input
输入含有一些选手群,每群选手都以一个整数n(n<1000)开头,后跟n对选手的比赛结果,比赛结果以一对选手名字(中间隔一空格)表示,前者战胜后者。如果n为0,则表示输入结束。

Output
对于每个选手群,若你判断出产生了冠军,则在一行中输出“Yes”,否则在一行中输出“No”。

Sample Input
3
Alice Bob
Smith John
Alice Smith
5
a c
c d
d e
b e
a d
0

Sample Output
Yes
No

Author
qianneng

Source
迎接新学期——超级Easy版热身赛

Recommend
lcy

#include<set>
#include<iostream>
using namespace std;
int main()
{
	set<string> cmp;//记录参赛者
	set<string> lose;//记录会被击败的选手
	int n;
	string cmp1, cmp2;
	while (cin >> n && n)
	{
		cmp.clear();//每轮清空容器
		lose.clear();
		while (n--)
		{
			cin >> cmp1 >> cmp2;
			cmp.insert(cmp1);//加到set里
			cmp.insert(cmp2);
			lose.insert(cmp2);
		}
		if (cmp.size() - lose.size() == 1)//能否产生冠军判断
			cout << "YES";
		else
			cout << "NO";
		cout << endl;
	}
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值