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 映照容器的更多相关文章

  1. map映照容器的使用

    map映照容器可以实现各种不同类型数据的对应关系,有着类似学号表的功能. 今天在做并查集的训练时,就用上了map映照容器. 题目就不上了,直接讲一下用法.顺便说一下,实现过程是在C++的条件下. #i ...

  2. map映照容器

    //map映照容器是由一个键值和一个映照数据组成的,键值与映照数据之间具有一一映照的关系 //map映照容器的键值不允许重复 ,比较函数值对元素 //的键值进行比较,元素的各项数据可通过键值检索出来 ...

  3. 统计频率(map映照容器的使用)

    问题描述  AOA非常喜欢阅读莎士比亚的诗,莎士比亚的诗中有种无形的魅力吸引着他!他认为莎士比亚的诗中之所以些的如此传神,应该是他的构词非常好!所以AOA想知道,在莎士比亚的书中,每个单词出现的频率各 ...

  4. POJ 1002 487-3279(map映照容器的使用)

    Description Businesses like to have memorable telephone numbers. One way to make a telephone number ...

  5. zoj 2104 Let the Balloon Rise(map映照容器的应用)

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2104 题目描述: Contest time again! Ho ...

  6. zoj 1109 Language of FatMouse(map映照容器的典型应用)

    题目连接: acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1109 题目描述: We all know that FatMouse doe ...

  7. map映照容器(常用的使用方法总结)

    map映照容器的数据元素是由一个键值和一个映照数据组成的,键值和映照数据之间具有一一对应的关系.map与set集合容器一样,不允许插入的元素的键值重复. /*关于C++STL中map映照容器的学习,看 ...

  8. C++STL之map映照容器

    map映照容器 map映照容器的元素数据是由一个键值和一个映照数据组成的, 键值与映照数据之间具有一一映照关系. map映照容器的数据结构也是采用红黑树来实现的, 插入元素的键值不允许重复, 比较函数 ...

  9. multimap多重映照容器(常用的方法总结)

    multimap和map的不同之处在于前者允许重复键值的元素出现. /*关于C++STL中mulitmap的学习,与map不同的是,multimap允许插入重复键值的元素*/ #include < ...

随机推荐

  1. Oracle PL/SQL中如何使用%TYPE和%ROWTYPE

    1. 使用%TYPE 在许多情况下,PL/SQL变量可以用来存储在数据库表中的数据.在这种情况下,变量应该拥有与表列相同的类型.例如,students表的first_name列的类型为VARCHAR2 ...

  2. C#实现对指定文件夹中文件按修改时间排序

    string path = "~/Document/Introduction/团队管理制度/";            DirectoryInfo dirinfo = new Di ...

  3. word2010 数学公式/联立方程/大括号内方程组如何左对齐?

    如何在word中输入的联立方程使其条件左对齐? 如输入: 实现如下对齐: 就是在每个逗号 .前输入一个 & 号就可以了, 注意这个逗号一定要是 位于这个方框里头,然后在其前面输入 & ...

  4. lumia 520无法开机

    拿出尘封已久的lumia 520,发现其开机困难,现象如下: 1.拿掉电池再放回去有几率开机 2.轻轻地用手机砸向桌面时手机会重启 因为手机在更新WP8.1之后就出问题了,所以先得定位问题,在黑屏的时 ...

  5. 20145215《Java程序设计》第10周学习总结

    20145215<Java程序设计>第十周学习总结 教材学习内容总结 网络编程 网络概述 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定 ...

  6. PRML读书会第四章 Linear Models for Classification(贝叶斯marginalization、Fisher线性判别、感知机、概率生成和判别模型、逻辑回归)

    主讲人 planktonli planktonli(1027753147) 19:52:28 现在我们就开始讲第四章,第四章的内容是关于 线性分类模型,主要内容有四点:1) Fisher准则的分类,以 ...

  7. iOS 自定义控件开发(上)

    工作需要,最近在进行iOS方面的图表工作.找了很多第三方库都无法实现效果,所以决定自己写一个控件. <iOS 自定义控件开发(上)> <iOS 自定义控件开发(中)> #0 目 ...

  8. spring+mybatis实现读写分离

    springmore-core spring+ibatis实现读写分离 特点 无缝结合spring+ibatis,对于程序员来说,是透明的 除了修改配置信息之外,程序的代码不需要修改任何东西 支持sp ...

  9. 趋势or过渡,量子点屏幕真的优于OLED?

    [导读]谁都知道买电视就是要买看起来很爽的产品,但怎么界定这个“爽”字?大部分人所知的是屏幕要够大,再近一步就是分辨率要够高——在这个4K分辨率逐步进入寻常家庭的时代,这两者已经不是选购屏幕类产品的大 ...

  10. java数组的增删改查

    import java.util.List; import java.util.ArrayList; import java.util.Set; import java.util.HashSet; p ...