数据结构 散列表

set 1.无重复元素 2.自动排序 3.和map不同 只有值没有键

在这里插入图片描述

#include <stdio.h> 
#include <set>
#include<iostream>
using namespace std;

void solve(set<int> s1,set<int> s2,set<int> &s3)
{
  set<int>::iterator it1;
  set<int>::iterator it2;
  it1=s1.begin(); 
  it2=s2.begin();
  while(it1!=s1.end()&&it2!=s2.end()){
  	if(*it1==*it2) {
  		s3.insert(*it1);
  		it1++;
  		it2++;
	  }
  	else if(*it1<*it2) it1++;
  	else it2++;
  }
}

void dispset(set<int> s) 
{ 
	if (s.empty()) 
	{
		printf("None\n");
		return;
	}
	
	set<int>::iterator it=s.begin();
	printf("%d",*it); 
	for (++it;it!=s.end();++it)
		printf(" %d",*it); 
	printf("\n");
}


int main()
{ 
    int n, m, a[105], b[105];
    while (scanf("%d", &n) != EOF)
	{
		for (int i = 0; i < n; i ++)
			scanf("%d", &a[i]);
		scanf("%d", &m);
		for (int i = 0; i < m; i ++)
			scanf("%d", &b[i]);
			
		set<int> s1(a,a+n); 
		set<int> s2(b,b+m);  
		set<int> s3;  
		solve(s1,s2,s3);  
		dispset(s3);
	} 
	return 0;
}

map是将关键字(key)和映射值(value)形成映射后绑定存储的容器,底层用红黑树实现,内部仍然有序,查找效率仍然为O(logn)
unordered_map底层用散列表实现,查找效率为O(1)
map一般就够用了。

map和set两种容器的底层结构都是红黑树,所以容器中不会出现相同的元素,因此count()的结果只能为0和1,可以以此来判断键值元素是否存在(当然也可以使用find()方法判断键值是否存在)。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;

map<string,int> myMap;//映射关键字  值类型 

int main(){
	//插入的两种方法 
	myMap["Emma"]=67;
	myMap["Benedict"]=100;
	myMap.insert(pair<string,int>("Bob",72));
	myMap.insert(pair<string,int>("Mary",85));
	myMap.insert(pair<string,int>("Alice",93));
	//一些方法 erase clear size empty
	myMap.erase("Benedict");
	cout<<"size of the map "<<myMap.size()<<endl; 
	//遍历 用迭代器
	map<string,int>::iterator it;//定义迭代器 
	for(it=myMap.begin();it!=myMap.end();it++){
		cout<<"the score of "<<it->first;
		cout<<":"<<it->second<<endl;
	}
	//迭代器+find方法 
	it=myMap.find("Bob");
	if(it!=myMap.end()) cout<<"Bob is found"<<endl;
	else cout<<"Bob is not found"<<endl;
}

在这里插入图片描述

映射 键和值的选择

在这里插入图片描述在这里插入图片描述

子串计算 map自动排好序

在这里插入图片描述

得到所有子串

for(int i=1;i<=str.size();i++){
			for(int j=0;j<i;j++){
				string key=str.substr(j,i-j);
				number[key]++;
			}
		}

题解 注意迭代器遍历

#include <iostream>
#include <vector>
#include <algorithm>
#include<cstring>
#include<queue>
#include<map>
using namespace std;

int main(){
	string str;
	while(cin>>str){
		map<string,int> number;
		for(int i=0;i<=str.size();i++){
			for(int j=0;j<i;j++){
				string key=str.substr(j,i-j);
				number[key]++;
			}
		}
		map<string,int>::iterator it;
		for(it=number.begin();it!=number.end();++it){
			if(it->second>1){
				cout<<it->first<<" "<<it->second<<endl;
			}
		}
	}	

}

利用自动排序 同时注意如何访问最后一个键值对

在这里插入图片描述

#include <iostream>
#include <vector>
#include <algorithm>
#include<cstring>
#include<queue>
#include<map>
using namespace std;

int main(){
	int n;
	while(cin>>n){
		map<string,string> in;
		map<string,string> out;
		while(n--){
			string s1,s2,s3;
			cin>>s1>>s2>>s3;
			in[s2]=s1;
			out[s3]=s1;
		}
		map<string,string>::iterator it;
		it=in.begin(); cout<<it->second<<" ";
		it=out.end(); it--; cout<<it->second;// 最后一个键值对!!!!!!!!!!!
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值