C++ map 映照容器
map映照容器的元素数据是一个键值和一个映照数据组成的,键值与映照数据之间具有一一映照的关系。
map映照容器的数据结构是采用红黑树来实现的,插入键值的元素不允许重复,比较函数只对元素的键值进行比较,元素的各项数据可通过键值检索出来。
使用map容器需要头文件包含语句“#include<map>”, map文件也包含了对multimap多重映照容器的定义。 、map创建、元素插入和遍历访问
创建map对象,键值与映照数据的类型由自己定义。在没有指定比较函数时,元素的插入位置是按键值由小到大插入到黑白树中去的,下面这个程序详细说明了如何操作map容器。
#include <map>
#include <string>
#include <iostream>
using std :: cout ;
6using std :: endl ;
7using std :: string ;
8using std :: map ;
int main()
{
//定义map对象,当前没有任何元素
map<string,float> m ; //插入元素,按键值的由小到大放入黑白树中
m["Jack"] = 98.5 ;
m["Bomi"] = 96.0 ;
m["Kate"] = 97.5 ; //先前遍历元素
map<string,float> :: iterator it ;
for(it = m.begin() ; it != m.end() ; it ++)
{
cout << (*it).first << " : " << (*it).second << endl ;
} return ;
} 运行结果:
Bomi :
Jack :98.5
Kate :97.5
程序编译试,会产生代号为“warning C4786” 的警告, “” 是标记符超长警告的代号。可以在程序的头文件包含代码的前面使用"#pragma waring(disable:4786)" 宏语句,强制编译器忽略该警告。4786号警告对程序的正确性和运行并无影响。
、删除元素
map映照容器的 erase() 删除元素函数,可以删除某个迭代器位置上的元素、等于某个键值的元素、一个迭代器区间上的所有元素,当然,也可使用clear()方法清空map映照容器。
下面这个程序演示了删除map容器中键值为28的元素:
#include <map>
#include <string>
#include <iostream>
using std :: cout ;
6using std :: endl ;
7using std :: string ;
8using std :: map ;
int main()
{
//定义map对象,当前没有任何元素
map<int, char> m ;
//插入元素,按键值的由小到大放入黑白树中
m[] = 'm' ;
m[] = 'k' ;
m[] = 'x' ;
m[] = 'a' ;
//删除键值为28的元素
m.erase() ;
//向前遍历元素
map<int, char> :: iterator it ;
for(it = m.begin() ; it != m.end() ; it ++)
{
//输出键值与映照数据
cout << (*it).first << " : " << (*it).second << endl ;
}
return ;
} 运行结果:
: x
: m
: a
、元素反向遍历
可以用反向迭代器reverse_iterator反向遍历map映照容器中的数据,它需要rbegin()方法和rend()方法指出反向遍历的起始位置和终止位置。
#include <map>
#include <string>
#include <iostream>
using std :: cout ;
6using std :: endl ;
7using std :: string ;
8using std :: map ;
int main()
{
//定义map对象,当前没有任何元素
map<int, char> m ;
//插入元素,按键值的由小到大放入黑白树中
m[] = 'm' ;
m[] = 'k' ;
m[] = 'x' ;
m[] = 'a' ;
//反向遍历元素
map<int, char> :: reverse_iterator rit ;
for( rit = m.rbegin() ; rit != m.rend() ; rit ++)
{
//输入键值与映照数据
cout << (*rit).first << " : " << (*rit).second << endl ;
}
return ;
} 运行结果:
: a
: k
: m
: x
、元素的搜索
使用find()方法来搜索某个键值,如果搜索到了,则返回该键值所在的迭代器位置,否则,返回end()迭代器位置。由于map采用黑白树数据结构来实现,所以搜索速度是极快的。
下面这个程序搜索键值为28的元素:
#include <map>
#include <string>
#include <iostream>
using std :: cout ;
6using std :: endl ;
7using std :: string ;
8using std :: map ;
int main()
{
//定义map对象,当前没有任何元素
map<int, char> m ;
//插入元素,按键值的由小到大放入黑白树中
m[] = 'm' ;
m[] = 'k' ;
m[] = 'x' ;
m[] = 'a' ;
map<int, char> :: iterator it ;
it = m.find() ;
if(it != m.end()) //搜索到该键值
cout << (*it).first << " : " << ( *it ).second << endl ;
else
cout << "not found it" << endl ;
return ;
} 、自定义比较函数
将元素插入到map中去的时候,map会根据设定的比较函数将该元素放到该放的节点上去。在定义map的时候,如果没有指定比较函数,那么采用默认的比较函数,即按键值由小到大的顺序插入元素。在很多情况下,需要自己编写比较函数。
编写方法有两种。
()如果元素不是结构体,那么,可以编写比较函数。下面这个程序编写的比较规则是要求按键值由大到小的顺序将元素插入到map中
#include <map>
#include <string>
#include <iostream>
using std :: cout ;
6using std :: endl ;
7using std :: string ;
8using std :: map ; //自定义比较函数 myComp
11struct myComp
{
bool operator() (const int &a, const int &b)
{
if(a != b) return a > b ;
else return a > b ;
}
} ;
int main()
{
//定义map对象,当前没有任何元素
map<int, char> m ;
//插入元素,按键值的由小到大放入黑白树中
m[] = 'm' ;
m[] = 'k' ;
m[] = 'x' ;
m[] = 'a' ;
//使用前向迭代器中序遍历map
map<int, char,myComp> :: iterator it ;
for(it = m.begin() ; it != m.end() ; it ++)
cout << (*it).first << " : " << (*it).second << endl ;
return ;
} 运行结果:
:a
:k
:m
:x
()如果元素是结构体,那么,可以直接把比较函数写在结构体内。下面的程序详细说明了如何操作:
#include <map>
#include <string>
#include <iostream>
using std :: cout ;
6using std :: endl ;
7using std :: string ;
8using std :: map ;
struct Info
{
string name ;
float score ;
//重载 “<”操作符,自定义排列规则
bool operator < (const Info &a) const
{
//按score由大到小排列。如果要由小到大排列,使用“>”号即可
return a.score < score ;
}
} ;
int main()
{
//定义map对象,当前没有任何元素
map<Info, int> m ;
//定义Info结构体变量
Info info ;
//插入元素,按键值的由小到大放入黑白树中
info.name = "Jack" ;
info.score = ;
m[info] = ;
info.name = "Bomi" ;
info.score = ;
m[info] = ;
info.name = "Peti" ;
info.score = 66.5 ;
m[info] = ;
//使用前向迭代器中序遍历map
map<Info,int> :: iterator it ;
for(it = m.begin() ; it != m.end() ; it ++)
{
cout << (*it).second << " : " ;
cout << ((*it).first).name << " : " << ((*it).first).score << endl ;
}
return ;
} 运行结果:
:Bomi
:Peti 66.5
:Jack
、用map实现数字分离
对数字的各位进行分离,采用取余等数学方法是很耗时的。而把数字当成字符串,使用map的映照功能,很方便地实现了数字分离。下面这个程序将一个字符串中的字符当成数字,并将各位的数值相加,最后输出各位的和。
#include <string>
#include <map>
#include <iostream>
using std :: cout ;
6using std :: endl ;
7using std :: string ;
8using std :: map ;
int main()
{
//定义map对象,当前没有任何元素
map<char, int> m ; //赋值:字符映射数字
m[''] = ;
m[''] = ;
m[''] = ;
m[''] = ;
m[''] = ;
m[''] = ;
m[''] = ;
m[''] = ;
m[''] = ;
m[''] = ;
/*上面的10条赋值语句可采用下面这个循环简化代码编写
27 for(int j = 0 ; j < 10 ; j++)
28 {
29 m['0' + j] = j ;
30 }
31 */
string sa, sb ;
sa = "" ;
int i ;
int sum = ;
for ( i = ; i < sa.length() ; i++ )
sum += m[sa[i]] ;
cout << "sum = " << sum << endl ;
return ;
} 、数字映照字符的map写法
在很多情况下,需要实现将数字映射为相应的字符,看看下面的程序:
#include <string>
#include <map>
#include <iostream>
using std :: cout ;
6using std :: endl ;
7using std :: string ;
8using std :: map ;
int main()
{
//定义map对象,当前没有任何元素
map<int, char> m ; //赋值:字符映射数字
m[] = '' ;
m[] = '' ;
m[] = '' ;
m[] = '' ;
m[] = '' ;
m[] = '' ;
m[] = '' ;
m[] = '' ;
m[] = '' ;
m[] = '' ;
/*上面的10条赋值语句可采用下面这个循环简化代码编写
27 for(int j = 0 ; j < 10 ; j++)
28 {
29 m[j] = '0' + j ;
30 }
31 */
int n = ;
string s = "The number is " ;
cout << s + m[n] << endl ;
return ;
} 运行结果:
The number is
重写比较器貌似只能针对key重写,value好像不行
C++ map 映照容器的更多相关文章
- map映照容器的使用
map映照容器可以实现各种不同类型数据的对应关系,有着类似学号表的功能. 今天在做并查集的训练时,就用上了map映照容器. 题目就不上了,直接讲一下用法.顺便说一下,实现过程是在C++的条件下. #i ...
- map映照容器
//map映照容器是由一个键值和一个映照数据组成的,键值与映照数据之间具有一一映照的关系 //map映照容器的键值不允许重复 ,比较函数值对元素 //的键值进行比较,元素的各项数据可通过键值检索出来 ...
- 统计频率(map映照容器的使用)
问题描述 AOA非常喜欢阅读莎士比亚的诗,莎士比亚的诗中有种无形的魅力吸引着他!他认为莎士比亚的诗中之所以些的如此传神,应该是他的构词非常好!所以AOA想知道,在莎士比亚的书中,每个单词出现的频率各 ...
- POJ 1002 487-3279(map映照容器的使用)
Description Businesses like to have memorable telephone numbers. One way to make a telephone number ...
- zoj 2104 Let the Balloon Rise(map映照容器的应用)
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2104 题目描述: Contest time again! Ho ...
- zoj 1109 Language of FatMouse(map映照容器的典型应用)
题目连接: acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1109 题目描述: We all know that FatMouse doe ...
- map映照容器(常用的使用方法总结)
map映照容器的数据元素是由一个键值和一个映照数据组成的,键值和映照数据之间具有一一对应的关系.map与set集合容器一样,不允许插入的元素的键值重复. /*关于C++STL中map映照容器的学习,看 ...
- C++STL之map映照容器
map映照容器 map映照容器的元素数据是由一个键值和一个映照数据组成的, 键值与映照数据之间具有一一映照关系. map映照容器的数据结构也是采用红黑树来实现的, 插入元素的键值不允许重复, 比较函数 ...
- multimap多重映照容器(常用的方法总结)
multimap和map的不同之处在于前者允许重复键值的元素出现. /*关于C++STL中mulitmap的学习,与map不同的是,multimap允许插入重复键值的元素*/ #include < ...
随机推荐
- 【Android性能优化】(一)使用SparseIntArray替换HashMap
SparseArray是android里为<Interger,Object>这样的Hashmap而专门写的class,目的是提高效率,其核心是折半查找函数(binarySearch)
- python实现概率分布
1. 二项分布(离散) import numpy as np from scipy import stats import matplotlib.pyplot as plt ''' # 二项分布 (b ...
- 在matlab中对hsv进行均匀量化和非均匀量化
首先,进行非均匀量化,H,S,V三通道分别量化为16,4,4级,返回一个向量.量化依据如下表: function vec = getHsvHist(Image) [M,N,O] = size(Imag ...
- IOS开发之—— ShareSDK的使用
官方下载ShareSDK iOS:http://sharesdk.cn/ ShareSDK社会化分享 包含“社会化分享组件”“社会化登录组件”“第三方评论和赞”三大模块,并有详尽的数据统计后台,助力移 ...
- 从Swift学习iOS开发的路线指引
本文主要是楼主近段时间从Swift语法开始自学iOS开发的流程总结,PS 一个前提,楼主的生存环境中买不到一本iOS开发中文教程,所以基本都是百度摸索出来的 >_< 主要流程 学习Swif ...
- brew-cask 之本地更新 node
本文同步自我的个人博客:http://www.52cik.com/2015/11/04/brew-cask-local.html 今天 Node v4.2.2 (LTS) 发布,什么是 LTS 呢,百 ...
- [bzoj 2005][NOI 2010]能量采集(容斥原理+递推)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2005 分析:首先易得ans=∑gcd(x,y)*2+1 然后我就布吉岛了…… 上网搜了下题解, ...
- 超市管理系统—NABCD模型
1) N (Need 需求) 需求分析: 超市的数据和业务越来越庞大,而计算机就是一种高效的管理系统,这就需要我们把超市的管理与计算机结合起来,从而超市管理系统应运而生.依靠现代化的计算机信息处理技术 ...
- 【BZOJ 3524】【Poi2014】Couriers 可持久化线段树
为什么这个主席树叫可持久化线段树,我不知道,具体得问达神.我无限T,然后DaD3zZ一针见血地指出了我的N*50爆内存导致无限编译超时O)ZO)ZO)Z真是太神啦.以图为鉴: 达神题解传送门:http ...
- c#截图
private void Form_Load(object sender, EventArgs e){ //接收web url string colle = string.Empty; stri ...