#2020寒假集训#C++STL-map代码笔记

#include<stdio.h>
#include<iostream>
#include<bits/stdc++.h>//万能头文件 
#include<map>//map头文件
#include<string>
using namespace std;
int main()
{
	printf("\n");
	map<string,int> m;
	/*
		按键自动升序的映射
		键有唯一性,不能对应多个值
		但可以多个键指向同一个值 
	*/
	string put;
	printf("请输入10个可重复string作为键:");
	//备用输入:kk zxl kk yr zxl kk zxl y kk yr 
	for(int i=0;i<10;i++)
	{
		cin>>put;
		m[put]++;
	}
	printf("\n");
	for(map<string,int>::iterator it=m.begin();it!=m.end();it++)
	{
		if(it!=m.begin()) printf(" ");
		else printf("正遍历输出每个string出现的次数:");
		cout<<it->first<<" "<<it->second;
	}//it->first指键,it->second指值 
	cout<<endl<<endl;
	/*
		注意此时的输出顺序是按照键排列的
		如string的字典序,默认升序
		map内部原理是红黑树,也是一种二叉搜索树
	*/
	for(map<string,int>::reverse_iterator rit=m.rbegin();rit!=m.rend();rit++)
	{
		if(rit!=m.rbegin()) printf(" ");
		else printf("反向迭代器遍历输出每个string出现的次数:");
		cout<<rit->first<<" "<<rit->second;
	}
	cout<<endl<<endl;
	m.erase(m.find("zxl"));
	for(map<string,int>::iterator it=m.begin();it!=m.end();it++)
	{
		if(it!=m.begin()) printf(" ");
		else printf("删除键为zxl的一对映射(find找迭代器,erase删)后:");
		cout<<it->first<<" "<<it->second;
	}//m.find(key)返回键为key的映射的迭代器,然后可以用m.erase(it)删除这对映射 
	cout<<endl<<endl;
	m.erase("yr");
	for(map<string,int>::iterator it=m.begin();it!=m.end();it++)
	{
		if(it!=m.begin()) printf(" ");
		else printf("m.erase(key)直接删除键为yr的一对映射后:");
		cout<<it->first<<" "<<it->second;
	}//m.erase(key)也可以直接删除键为key的这对映射 
	cout<<endl<<endl;
	printf("用m.clear();清空前用size输出映射对数:%d\n\n",m.size()); 
	m.clear();//非常重要!!!尤其循环的末尾,不要忘记清空!!!
	printf("用m.clear();清空后用size输出映射对数:%d\n\n",m.size()); 
	/*
		m.clear();功效类似于 m.erase(m.begin(),m.end());
		但erase的括号里面不一定能用+,Dev会报错(如m.begin()+1) 
		
		直接删除迭代器(erase的是it)比删除元素(erase的是键或其他容器同理的值)
		在时间复杂度上更快
	*/
} 

运行结果如下
在这里插入图片描述

发布了22 篇原创文章 · 获赞 0 · 访问量 418

猜你喜欢

转载自blog.csdn.net/qq_46184427/article/details/103967684