一、概述

map 由红黑树实现,其元素都是 “键值/实值” 所形成的一个对组(key/value pairs)。每个元素有一个键,是排序准则的基础。每一个键只能出现一次,不允许重复。

map主要用于资料一对一映射的情况,map 内部自建一颗红黑树,这颗树具有对数据自动排序的功能,所以在 map 内部所有的数据都是有序的。比如一个班级中,每个学生的学号跟他的姓名就存在着一对一映射的关系。

二、定义及初始化

使用之前必须加相应容器的头文件:

#include <map> // map属于std命名域的,因此需要通过命名限定,例如using std::map;

定义的代码如下:

map<int, string> a; // 定义一个int类型的映射a
// map<int, string> a(10); // error,未定义这种构造函数
// map<int, string> a(10, 1); // error,未定义这种构造函数
map<int, string> b(a); // 定义并用映射a初始化映射b
// map<int, string> b(a.begin(), a.end()); // error,未定义这种构造函数

三、基本操作

3.1 容量函数

  • 容器大小:mp.size();
  • 容器最大容量:mp.max_size();
  • 容器判空:mp.empty();
  • 查找键 key 的元素个数:mp.count(key);
#include <iostream>
#include <map>
#include <string> using namespace std; int main(int argc, char* argv[])
{
map<int,string> mp;
mp.insert({ 1, "张三" });
mp.insert({ 2, "李四" });
mp.insert(pair<int, string>{ 3, "隔壁老王" }); cout << mp.size() << endl; // 输出:3
cout << mp.max_size() << endl; // 输出:89478485 // 输出:1
cout << mp.count(2) << endl; // 输出:1
if (mp.empty())
cout << "元素为空" << endl; // 未执行 return 0;
}

3.2 添加函数

  • 在容器中插入元素:mp.insert(const T& x);
  • 任意位置插入一个元素:mp.insert(iterator it, const T& x);
#include <iostream>
#include <map>
#include <string> using namespace std; int main(int argc, char* argv[])
{
map<int,string> mp;
// 在容器中插入元素
mp.insert({ 1, "张三" });
mp.insert({ 2, "李四" });
// 任意位置插入一个元素
map<int, string>::iterator it = mp.begin();
mp.insert(it, pair<int, string>{ 3, "隔壁老王" }); // 会自动排序 for (it = mp.begin(); it != mp.end(); it++)
cout << it->first << " " << it->second << endl;
cout << endl; return 0;
} /*
1 张三
2 李四
3 隔壁老王
*/

3.3 删除函数

  • 删除键值为 keyValue 的元素:mp.pop_back(const T& keyValue);
  • 删除迭代器所指的元素:mp.erase(iterator it);
  • 删除区间[first,last]之间的所有元素:mp.erase(iterator first, iterator last);
  • 清空所有元素:mp.clear();
#include <iostream>
#include <map>
#include <string> using namespace std; int main(int argc, char* argv[])
{
map<int,string> mp;
// 在容器中插入元素
mp.insert({ 1, "张三" });
mp.insert({ 2, "李四" });
mp.insert({ 4, "王五" });
mp.insert({ 5, "小明" });
// 任意位置插入一个元素
mp.insert(mp.begin(), pair<int, string>{ 3, "隔壁老王" }); // 会自动排序 // 删除键值为keyValue的元素
mp.erase(2);
// 删除迭代器所指的元素
mp.erase(mp.begin());
// 删除区间[first,last]之间的所有元素
mp.erase(mp.begin(), ++mp.begin()); // 遍历显示
map<int, string>::iterator it = mp.begin();
for (it = mp.begin(); it != mp.end(); it++)
cout << it->first << " " << it->second << endl; // 清空容器内的所有元素
mp.clear(); // 判断map是否为空
if (st.empty())
cout << "元素为空" << endl; // 输出:元素为空 return 0;
} /*
4 王五
5 小明
元素为空
*/

3.4 访问函数

  • 查找键 key 是否存在,若存在,返回该键的元素的迭代器;若不存在,返回 map.end(): mp.find(key);
#include <iostream>
#include <map>
#include <string> using namespace std; int main(int argc, char* argv[])
{
map<int,string> mp;
// 在容器中插入元素
mp[1] = "张三";
mp[2] = "李四";
mp[3] = "隔壁老王"; // 通过find(key)查找键值
cout << mp.find(1)->first << endl; // 输出:1
cout << mp.find(2)->second << endl; // 输出:李四 return 0;
}

3.5 其他函数

  • 交换两个同类型容器的元素:swap(map&, map&);mp.swap(map&);
#include "stdafx.h"
#include <iostream>
#include <map>
#include <string> using namespace std; int main(int argc, char* argv[])
{
map<int,string> mp1;
// 在容器中插入元素
mp1[1] = "张三";
mp1[2] = "李四";
mp1[3] = "隔壁老王"; map<int, string> mp2;
// 在容器中插入元素
mp2[1] = "tom";
mp2[2] = "jerry";
mp2[3] = "mariy"; // 交换两个容器的元素
mp2.swap(mp1); // 通过iterator遍历mp1
map<int, string>::iterator it;
for (it = mp1.begin(); it != mp1.end(); it++)
cout << it->second << " "; // 输出:tom jerry mariy
cout << endl; return 0;
}

四、迭代器与算法

1. 迭代器

  • 开始迭代器指针:mp.begin();
  • 末尾迭代器指针:mp.end(); // 指向最后一个元素的下一个位置
  • 指向常量的开始迭代器指针:mp.cbegin(); // 意思就是不能通过这个指针来修改所指的内容,但还是可以通过其他方式修改的,而且指针也是可以移动的。
  • 指向常量的末尾迭代器指针:mp.cend();
  • 反向迭代器指针,指向最后一个元素:mp.rbegin();
  • 反向迭代器指针,指向第一个元素的前一个元素:mp.rend();
  • 返回最后一个 key<=keyElem 元素的迭代器:mp.lower_bound(keyElem);
  • 返回第一个 key>keyElem 元素的迭代器:mp.upper_bound(keyElem);
  • 返回容器中 key 与 keyElem 相等的上下限的两个迭代器,这两个迭代器被放在对组(pair)中: mp.equal_range(keyElem);
#include <iostream>
#include <map>
#include <string> using namespace std; int main(int argc, char* argv[])
{
map<int,string> mp;
// 在容器中插入元素
mp[1] = "张三";
mp[2] = "李四";
mp[3] = "隔壁老王"; cout << mp.begin()->first << endl; // 输出:1
cout << (--mp.end())->first << endl; // 输出:3
cout << mp.cbegin()->first << endl; // 输出:1
cout << (--mp.cend())->first << endl; // 输出:3
cout << mp.rbegin()->first << endl; // 输出:3
cout << (--mp.rend())->first << endl; // 输出:1
cout << mp.lower_bound(2)->first << endl; // 输出:2
cout << mp.upper_bound(2)->first << endl; // 输出:3
pair<map<int, string>::iterator, map<int, string>::iterator> t_pair = mp.equal_range(2);
cout << t_pair.first->first << endl; // 输出:2
cout << t_pair.second->first << endl; // 输出:3
cout << endl; return 0;
}

2. 算法

  • 遍历元素
map<int>::iterator it;
for (it = mp.begin(); it != mp.end(); it++)
cout << it->second << endl;

五、总结

可以看到,map 与set的用法基本一致,只有以下一处不同:

  • map 可以像数组那样插入元素,而 set 不行。

[C++ STL] map使用详解的更多相关文章

  1. C++中的STL中map用法详解(转)

    原文地址: https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html C++中的STL中map用法详解   Map是STL的一个关联容器,它提供 ...

  2. STL bind1st bind2nd详解

    STL bind1st bind2nd详解   先不要被吓到,其实这两个配接器很简单.首先,他们都在头文件<functional>中定义.其次,bind就是绑定的意思,而1st就代表fir ...

  3. GoLang基础数据类型--->字典(map)详解

    GoLang基础数据类型--->字典(map)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   可能大家刚刚接触Golang的小伙伴都会跟我一样,这个map是干嘛的,是 ...

  4. Jquery遍历筛选数组的几种方法和遍历解析json对象|Map()方法详解

    Jquery遍历筛选数组的几种方法和遍历解析json对象|Map()方法详解 一.Jquery遍历筛选数组 1.jquery grep()筛选遍历数组 $().ready( function(){ v ...

  5. C++ STL bitset 容器详解

    C++ STL bitset 容器详解 本篇随笔讲解\(C++STL\)中\(bitset\)容器的用法及常见使用技巧. \(bitset\)容器概论 \(bitset\)容器其实就是个\(01\)串 ...

  6. map接口详解

    1.Map接口详解(1)映射(map)是一个存储键.键值对的对象,给定一个键,可以查询得到它的值,键和值都可以是对象(2)键必须是唯一的,值可以重复(Map接口映射唯一的键到值)(3)有些映射可以接收 ...

  7. 2.3 C++STL vector容器详解

    文章目录 2.3.1 引入 2.3.2 代码实例 2.3.3 运行结果 总结 2.3.1 引入 vector 容器 动态数组 可变数组 vector容器 单口容器(尾部操作效率高) vector动态增 ...

  8. C++中的STL中map用法详解

    Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时 ...

  9. (转载) STL中map用法详解

    Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候 ...

随机推荐

  1. codeforces 88E Interesting Game

    题目大意: 两个好朋友再将一堆物品分堆,每次都将一堆物品分成数量连续的至少两个堆,直到一个人不能分堆为输 第一次做博弈问题,看了百度文库的http://wenku.baidu.com/link?url ...

  2. POJ 3279 Fliptile【枚举】

    题意: 又是农夫和牛的故事...有m*n个黑白块,黑块的背面是白块,白块背面是黑块,一头牛踩一块,则这个块的上下左右的方块都会转动,问至少踩多少块,才会使所有块都变成白色? 分析: 还是开关问题,同样 ...

  3. Remove Duplicates from Sorted Array(参考)

    Given a sorted array, remove the duplicates in place such that each element appear only once and ret ...

  4. Java:PPT(X)转图片、PDF和SVG

    (一) 简介: 工作中,PowerPoint文档有时需要被转换为PDF/图像文件来存档.因为PDF或图片的页面布局是固定的,很难被修改且能被大多数设备打开,所以PDF或者图片比起PowerPoint格 ...

  5. spring boot项目自定义数据源,mybatisplus分页、逻辑删除无效解决方法

    Spring Boot项目中数据源的配置可以通过两种方式实现: 1.application.yml或者application.properties配置 2.注入DataSource及SqlSessio ...

  6. C#使用全局钩子(hook),SetWindowsHookEx返回0、不回调的解决

    http://www.csharpwin.com/csharpspace/3766r5747.shtml 在.net 2005平台下 在使用全局hook时,总是遇见SetWindowsHookEx的返 ...

  7. C# .NET 如何修改代码字体

    工具-选项-字体和颜色

  8. C# .NET 如何批量增加或取消注释

    选中一批文本之后 批量增加注释:Ctrl+K Ctrl+C 批量取消注释:Ctrl+K Ctrl+U  

  9. 在.Net MVC结构API接口中推断http头信息实现公共的权限验证过滤器演示样例

    //control   action public class TestController : ApiController { [MyAuthFilter] public string test(s ...

  10. 另存为Alt-F-A ©┗ 最近使用的文档/选项

    另存为Alt-F-A © ┗ 最近使用的文档/选项