一、set介绍:

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

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

二、用法

1、头文件

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

2、定义及初始化

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.resize();
  • 容器判空: mp.empty();
  • 查找键key的元素个数: mp.count(key);
#include "stdafx.h"
#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;cout << "元素最大容量: " << mp.max_size() << endl;cout << "键2的元素个数: " << mp.count(2) << endl;if (mp.empty())cout << "元素为空" << endl;return 0;
}/*
元素大小: 3
元素最大容量: 89478485
键2的元素个数: 1
*/

(2) 增加函数

  • 在容器中插入元素:mp.insert(const T& x);
  • 任意位置插入一个元素: mp.insert(iterator it, const T& x);
#include "stdafx.h"
#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) 删除函数

  • 删除键值为keyValue的元素: mp.pop_back(const T& keyValue);
  • 删除迭代器所指的元素: mp.erase(iterator it);
  • 删除区间[first,last]之间的所有元素: mp.erase(iterator first, iterator last);
  • 清空所有元素: mp.clear();
#include "stdafx.h"
#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());//display mapmap<int, string>::iterator it = mp.begin();for (it = mp.begin(); it != mp.end(); it++)cout << it->first << " " << it->second << endl;//清空容器内的所有元素mp.clear();//display mapcout << "mp:";for (it = mp.begin(); it != mp.end(); it++)cout << it->first << " " << it->second << endl;cout << endl;return 0;
}/*
4 王五
5 小明
mp:
*/

(4) 迭代器

  • 开始迭代器指针: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 "stdafx.h"
#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()): " << mp.begin()->first << endl;cout << "*(mp.end()): " << (--mp.end())->first << endl;cout << "*(mp.cbegin()): " << mp.cbegin()->first << endl;cout << "*(mp.cend()): " << (--mp.cend())->first << endl;cout << "*(mp.rbegin()): " << mp.rbegin()->first << endl;cout << "*(mp.rend()): " << (--mp.rend())->first << endl;cout << "*(mp.lower_bound(2)): " << mp.lower_bound(2)->first << endl;cout << "*(mp.upper_bound(2)): " << mp.upper_bound(2)->first << endl;pair<map<int, string>::iterator, map<int, string>::iterator> t_pair = mp.equal_range(2);cout << "*(t_pair.first): " << t_pair.first->first << endl;cout << "*(t_pair.second): " << t_pair.second->first << endl;cout << endl;return 0;
}/*
*(mp.begin()): 1
*(mp.end()): 3
*(mp.cbegin()): 1
*(mp.cend()): 3
*(mp.rbegin()): 3
*(mp.rend()): 1
*(mp.lower_bound(2)): 2
*(mp.upper_bound(2)): 3
*(t_pair.first): 2
*(t_pair.second): 3
*/

(5) 访问函数

  • 查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回map.end(): mp.find(key);
#include "stdafx.h"
#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 << "find(key)查找键: " << mp.find(1)->first << endl;cout << "find(key)查找值: " << mp.find(2)->second << endl;return 0;
}/*
find(key)查找键: 1
find(key)查找值: 李四
*/

(6) 其他函数

  • 交换两个同类型容器的元素: 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";//交换两个容器的元素//swap(mp1,mp2); //okmp2.swap(mp1);//通过iterator遍历mp1map<int, string>::iterator it;for (it = mp1.begin(); it != mp1.end(); it++)cout << it->second << " ";cout << endl;return 0;
}/*
tom jerry mariy
*/

(7) 算法

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

三、总结

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

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

转载于:https://www.cnblogs.com/linuxAndMcu/p/10261263.html

[C++ STL] map使用详解相关推荐

  1. STL MAP用法详解

    暂时未找到原创作者,望知情人士告知,谢过. 第一转贴:http://blog.csdn.net/nwf5d/archive/2009/07/10/4338872.aspx 说明:如果你具备一定的C++ ...

  2. pythonpandas函数详解_对pandas中Series的map函数详解

    Series的map方法可以接受一个函数或含有映射关系的字典型对象. 使用map是一种实现元素级转换以及其他数据清理工作的便捷方式. (DataFrame中对应的是applymap()函数,当然Dat ...

  3. c语言stl模板,c/c++开发分享C++ 标准模板库 STL 顺序容器详解

    c++ 标准模板库 stl 顺序容器 容器 顺序性 重复性 支持迭代器 vector 动态数组 无序 可重复 随机访问迭代器 deque 双向队列 无序 可重复 随机访问迭代器 list 双向链表 无 ...

  4. java map中的entry_java中Map及Map.Entry详解(组图)

    java中Map及Map.Entry详解(组图) 08-22栏目:技术 TAG:map.entry map.entry Map是java中的接口,Map.Entry是Map的一个内部接口. copyr ...

  5. java+getactionmap_Struts2 使用OGNL遍历map方法详解

    一.Action中的代码:MapAction.java package com.zx.demo.action; import java.util.ArrayList; import java.util ...

  6. 集合 (二) ----- Map集合详解

    相关文章: <集合 (一) ----- 集合的基本概念与Collection集合详解> <集合 (二) ----- Map集合详解> 文章目录 Map集合详解 一.Map集合基 ...

  7. hive linux进程数,控制Hive MAP个数详解

    控制Hive MAP个数详解 Hive的MAP数或者说MAPREDUCE的MAP数是由谁来决定的呢?inputsplit size,那么对于每一个inputsplit size是如何计算出来的,这是做 ...

  8. [学习C++ ]C++ STL 全排列函数详解(排列组合与匹配算法)--1

    一.概念 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列.如果这组数有n个,那么全排列数为n!个. 比如a ...

  9. Kotlin 基础——Map集合详解

    Kotlin基础--Map集合详解 一.声明和创建Map集合 二.使用Map的方法 三.遍历Map四种方式 四.可变的Map Kotlin的Map集合用于保存key-value对,其也被分为可变的和不 ...

最新文章

  1. oracle idm suite,CorelDRAW Graphics Suite 2018官方英文试用版 离线直接安装 下载地址
  2. Android应用博客目录
  3. Django 和 Ajax 简介
  4. python 线程类 threading.Thread.join() 方法 (自闭,不让别人进来了)
  5. Opencv2.4.9源码分析——HoughLinesP
  6. php strus2 漏洞攻击_关于对部分重要漏洞进行安全加固的预警通报
  7. MACAPP中引入ffmpeg库完成具体功能
  8. apipost提示error:invalid protocol的解决方案
  9. ucc编译器(优化)
  10. 域做文件服务器,linux 做域文件服务器
  11. 力控批量建立数据库点参数操作
  12. 情人节送男生什么礼物好,情人节送礼清单
  13. 新版白话空间统计(11):ArcGIS中的PZ值标尺
  14. smartupload功能介绍
  15. 三星固态sm863,pm863,sm865,sm865a颗粒
  16. html查看器缩字数,在线字数统计工具-统计字符字节汉字数字标点符号-计算word文章字数-使用帮助-字的区别...
  17. 北大公开课-计算概论
  18. 格拉姆矩阵 Gram Matrix 简单理解
  19. 作业帮-后台开发岗 面经
  20. ATMEL芯片系列介绍1

热门文章

  1. apache rewrite 支持post 数据
  2. 论天空、太空、航空、航天
  3. 工业计算机是服务器吗,工控机服务器能通用吗_服务器和工控机有什么区别
  4. java程序a-z_用Java写一个程序:使其输出从A-Z的排序字母
  5. c语言解逻辑问题的一般步骤,C语言面试题---逻辑短路问题
  6. php 变量输入,PHP-输入变量
  7. 创建数据库是列名无效咋办_怎样解决列名无效 - 技术问答 - .Net源码论坛 .net源码,ASP.net|论坛 - Powered by Discuz!NT...
  8. oracle单表数据量上亿_MySQL数据库中,数据量越来越大,有什么具体的优化方案么?...
  9. 046_byte的值在计算机中的表示
  10. 016_泛型常见通配符