set、map相关学习整理 && 使用set、map解题的 非原创的 2.3、2.4简洁代码

本文通过两个C++编程示例介绍了set和map容器的使用。示例1展示了如何利用set去重并输出唯一字符串,示例2则演示了map容器在电话号码簿场景下的应用,包括存储联系人及其电话号码,并排除号码后缀相同的记录。文章重点讨论了set的插入、查找和删除操作以及map的键值对存储。
摘要由CSDN通过智能技术生成

在这里插入图片描述
http://www.cplusplus.com/reference/set/set/?kw=set

set资料参考

set容器理解与基本用法
set用法详解
set详详解

set特点如下:
1、都是排好序的
2、没有重复的元素
3.在set中查找是使用二分查找,每次排序、插入、删除都是O(logn)(以2为底)的复杂度。但是与map容器不同,set容器不支持下标操作访问元素
4.判断set是否插入成功方法
set的带有一个键参数的insert版本函数返回pair类型对象,该对象包含一个迭代器和一个bool值,迭代器指向拥有该键的元素,而bool值表明是否添加了元素

map相关参考

2.3 缺席考试的是谁?

#include<iostream>
#include<set>
using namespace std;
int main()
{
	int n;
	while(cin>>n&&n)
	{
		set<string> student;
		for(int i=0;i<2*n-1;i++)
		{
			string s;cin>>s;
			if(student.insert(s).second==false)
				student.erase(s);
		}
		cout<<*student.begin()<<endl;
	}
}

2.4 电话号码

#include<iostream>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(string x,string y)
{
	if(x.length()!=y.length()) return x.length()<y.length();
	return x<y;
}
int main()
{
	map<string,set<string> > directory;
	int n;cin>>n;
	while(n--)
	{
		string name;int num;
		cin>>name>>num;
		for(int i=0;i<num;i++)
		{
			string s;cin>>s;
			directory[name].insert(s);
		}
	}
	cout<<directory.size()<<endl;
	for(map<string,set<string> >::iterator it=directory.begin();it!=directory.end();++it)
	{
		vector<string> number;
		for(set<string>::iterator iter1=it->second.begin();iter1!=it->second.end();++iter1)
		{
			int flag=1;
			for(set<string>::iterator iter2=it->second.begin();iter2!=it->second.end();++iter2)
			{
				int a=(*iter1).length(),b=(*iter2).length();
				if(a>=b) continue;
				string temp;
				if(a<b) temp=(*iter2).substr(b-a);//temp为s2子串,存在s1是s2后缀的可能
				if(temp==(*iter1))	flag=0;//s1是后缀,不计入 
			}
			if(flag==1) number.push_back(*iter1);
		}
		sort(number.begin(),number.end(),cmp);
		cout<<it->first<<" "<<number.size();
		for(int i=0;i<(int)number.size();i++)
			cout<<" "<<number[i];
		cout<<endl; 
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值