map映照容器

简介: map映照容器map映照容器


map映照容器

  • map映照容器的元素数据是由一个键值和一个映照数据组成的,键值与映照数据之间具有一一映照的关系。
  • map映照容器的数据结构也是采用红黑树来实现的,插入元素的键值不允许重复
  • 比较函数只对元素的键值进行比较,元素的各项数据可通过键值检索出来。
  • map映照容器元素的数据构成示意图。

  • 需要包含头文件“#include ”

map文件也包含了对multimap多重映照容器的定义。

使用

map创建、元素插入和遍历访问

  • 创建map对象,键值与映照数据的类型由自己定义。
  • 在没有指定比较函数时,元素的插入位置是按键值由小到大插入到黑白树中去的,这点和set一样。
#include<iostream>
#include<map>
using namespace std;
int main(){
  //定义map对象,目前没有任何对象 
  map<string,float> m;
  //插入元素,按键值的由小到大放入黑白树中
  m["jack"] =80;
  m["marry"] = 81; 
    //前向遍历
  map<string,float>::iterator it;
  for(it = m.begin();it!=m.end();it++){
     //输出键值与映照数据
    cout<<(*it).first<<" : "<<(*it).second<<endl;
  } 
  return 0;
}

程序编译时,可能会产生代号为“warning C4786”的警告,“4786”是标记符超长警告的代号。

可以在程序的头文件包含代码的前面使用“#pragma warning(disable:4786)”宏语句,强制编译器忽略该警告。

4786号警告对程序的正确性和运行并无影响。

删除元素

  • map映照容器的erase()删除元素函数,可以删除某个迭代器位置上的元素、等于某个键值的元素、一个迭代器区间上的所有元素。
  • 也可使用clear()方法清空map映照容器。
//删除"jack"
m.erase("jack");

元素反向遍历

可以使用反向迭代器reverse_iterator反向遍历map照映容器中的数据,它需要rbegin()方法和rend()方法指出反向遍历的起始位置和终止位置。

//反向遍历
map<string,float>::reverse_iterator rit;
for(rit = m.rbegin();rit != m.rend();rit++) {
    //输出键值与映照数据
    cout<<(*rit).first<<"\t"<<(*rit).second<<endl;
}

元素的搜索

使用find()方法来搜索某个键值,如果搜索到了,则返回该键值所在的迭代器位置,否则,返回end()迭代器位置。

map<string,float>::iterator it;
  
it = m.find("jack");
if(it != m.end()){
    cout<<"find it"<<endl;
}else{
    cout<<"can not find it"<<endl;
}

自定义比较函数

  • 将元素插入到map中去的时候,map会根据设定的比较函数将该元素放到该放的节点上去。
  • 在定义map的时候,如果没有指定比较函数,那么采用默认的比较函数,即按键值由小到大的顺序插入元素。
  • 编写比较函数与set比较函数是一致的,因为它们的内部数据结构都是红黑树。编写方法有两种。
  1. 如果元素不是结构体,那么,可以编写比较类。
//由大到小 
struct myComp{
  //重载()操作符 
  bool operator() (const string& a, const string& b){
    return a>b;
  } 
};
//定义map对象,采用自定义比较函数
map<string,float,myComp> m;
  1. 如果元素是结构体,那么,可以直接把比较函数写在结构体内。
#include<iostream>
#include<map>
using namespace std;
//由大到小 
struct info{
  float score;
  
  //重载 < 操作符,自定义排序规则
  bool operator < (const info& b) const {
    return score > b.score;
  } 
};
int main(){
  //定义map对象,目前没有任何对象 
  map<info,string> m;
  
  info a ={80};
  m[a] = "jack";
  
  a.score = 90;
  m[a] = "marry";
  
  map<info,string>::iterator it;  
  for(it = m.begin();it!=m.end();it++){
     //输出键值与映照数据
    cout<<(*it).second<<"\t"<<(*it).first.score<<endl;
  } 
  cout<<endl;
  return 0;
}

用map实现数字分离

对数字的各位进行分离,采用取余等数学方法操作是很耗时的。

把数字当成字符串,使用map的映照功能,很方便地实现了数字分离。

字符到数字的映射

map<char,int> m;
  
/*
  m['0'] =0;
  m['1'] =1;
  ...
*/ 
for(int i =0 ;i<10;i++){
    m['0'+i] = i;
}

数字映照字符的map写法

实现将数字映射为相应的字符

map<int,char> m;
  
/*
  m[0] ='0';
  m[1] ='1';
  ...
*/ 
for(int i =0 ;i<10;i++){
    m[i] = i+'0';
}
相关文章
|
8天前
|
存储 算法 NoSQL
C++一分钟之-map与set容器详解
【6月更文挑战第21天】C++ STL的`map`和`set`是基于红黑树的关联容器,提供有序存储和高效查找。`map`存储键值对,键唯一,值可重复;`set`仅存储唯一键。两者操作时间复杂度为O(log n)。常见问题包括键的唯一性和迭代器稳定性。自定义比较函数可用于定制排序规则,内存管理需注意适时释放。理解和善用这些工具能提升代码效率。
13 3
|
22天前
|
存储 人工智能 C++
map容器在C++中的具体用法以及相关注意点
map容器在C++中的具体用法以及相关注意点
19 1
|
2天前
|
C++ 容器
C++ STL标准库 《map容器详解》
C++ STL标准库 《map容器详解》
7 0
|
2天前
|
存储 C++ 容器
C++ STL标准库 《map容器详解》
C++ STL标准库 《map容器详解》
8 0
|
3天前
|
C++ 容器
C++之map/multimap容器
C++之map/multimap容器
5 0
|
3天前
|
编译器 C++ 容器
通过红黑树封装 map 和 set 容器
通过红黑树封装 map 和 set 容器
|
11天前
|
存储 安全 C++
Map容器详解
Map容器详解
|
1月前
|
C++ 索引 容器
黑马c++ STL部分 笔记(9) map/multimap容器
黑马c++ STL部分 笔记(9) map/multimap容器
|
1月前
|
存储 安全 Java
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
20 0
|
1月前
|
C++ 容器
STL—map容器
STL—map容器