欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-02 12:33:24
...
#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的是键或其他容器同理的值)
		在时间复杂度上更快
	*/
} 

运行结果如下
#2020寒假集训#C++STL-map代码笔记

相关标签: 2020寒假集训