#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的是键或其他容器同理的值)
在时间复杂度上更快
*/
}
运行结果如下
上一篇: 数据库查询优化