C++:主要的关联容器类型:map

2023-10-27

目录

1.关联式容器

2.键值对

3.树形结构的关联式容器

4.map的特点

5.使用map

常用接口的使用:

1.find

2.insert

3.erase

4.operator[ ]

6.multimap


1.关联式容器

与vector,list,queue等底层为线性序列的数据结构的序列式容器有着不同,关联式容器里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。与之相对,序列式容器中的元素是按照它们在容器中的位置来顺序保存和访问的。

2.键值对

用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代
表键值,value表示与key对应的信息。比如:以一个人的名字为key值,再将他的手机号当作value值,这样我们就可以通关一个人的名字找到他对应的手机号。

3.树形结构的关联式容器

树形结构的关联式容器主要有四种:map, set, multimap, multiset。这四种容器的共同点是:使用平衡搜索树(红黑树)作为其底层结果,容器中的元素是一个有序的序列。

以下将主要介绍map容器。

4.map的特点

1.map是关键字-值对的集合。例如可以将一个人的名字作为关键字,将其电话号码作为值。我们称这样的数据结构为“将名字映射到电话号码”。map类型通常被称为关联数组。

2.map中的key是唯一的,并且不能修改。

3.默认按照小于的方式对key进行比较。

4.map的底层为平衡搜索树,所以使用map进行查找时效率比较高,时间复杂度为\log_{2}N

5.map中的元素如果用迭代器去遍历,可以得到一个有序的序列。

6.map重载了[ ]操作符,可以使用operator[ ]进行查找删除。

5.使用map

常用接口的使用:

1.find

成员类型iterator和const_iterator是指向(value_type类型)元素的双向迭代器类型。

#include <iostream>
#include <map>
using namespace std;
int main ()
{
  std::map<char,int> mymap;
  std::map<char,int>::iterator it;

  mymap['a']=50;
  mymap['b']=100;
  mymap['c']=150;
  mymap['d']=200;
  cout << "a =>" << mymap.find('a')->second << endl;
  cout << "b =>" << mymap.find('b')->second << endl;    
  cout << "c =>" << mymap.find('c')->second << endl;
  cout << "d =>" << mymap.find('d')->second << endl;
  
  return 0;
}

如果找到具有指定键的元素,则为该元素的迭代器,否则为map::end。

2.insert

#include <iostream>
$include <map>
int main()
{    
    map<string, string> dict;
	dict.insert(pair<string, string>("sort", "排序"));
	dict.insert(pair<string, string>("test", "测试"));
    dict.insert(pair<string, string>("string", "111"));
	dict.insert(make_pair("left", "左边"));
    dict.insert(pair<string, string>("string", "XXXX"));
    
    for (const auto& kv : dict)
	{
		cout << kv.first << ":" << kv.second << endl;
	}
	cout << endl;
    
    return 0;
}

 因为map中元素的键是唯一的,所以插入操作会检查每个被插入元素的键是否与容器中已经存在的元素的键相等,如果相等,则不插入该元素,并返回一个指向该元素的迭代器(如果该函数有返回值)。

3.erase

poison:指向从map中删除的单个元素的迭代器。

k         :要从map中删除的元素的键(key)。

[first,lst):指定map容器内要删除的范围的迭代器:[第一个,最后一个)。也就是说,范围包括first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。

#include <iostream>
#include <map>
using namespace std;
int main()
{
    map<char, int> mymap;
    map<char, int>::iterator it;

    // 插入值
    mymap['a'] = 10;
    mymap['b'] = 20;
    mymap['c'] = 30;
    mymap['d'] = 40;
    mymap['e'] = 50;
    mymap['f'] = 60;

    it = mymap.find('b');
    mymap.erase(it);                   // 通过迭代器进行删除

    mymap.erase('c');                  //通过键进行删除

    it = mymap.find('e');
    mymap.erase(it, mymap.end());    // 通过范围进行删除

    // 显示内容
    for (it = mymap.begin(); it != mymap.end(); ++it)
        cout << it->first << " => " << it->second << end;

    return 0;
}

从map容器中删除单个元素或一组元素[first,last)(左闭右开)。
这可以有效地通过删除的元素(即被销毁的元素)减少容器的大小。

4.operator[ ]

1.map中有这个key,返回value的引用  (同时也可以通过此点查找和修改value)

2.map中没有这个key,会插入一个pair(key,v());返回value的引用。 (注意,即使没有映射值给元素(元素是使用其默认构造函数构造的),这样做也会使容器大小增加1。)

调用这个函数等价于:

(*((this->insert(make_pair(k,mapped_type()))).first)).second

// 访问map的值
#include <iostream>
#include <map>
#include <string>
using namespace std;

int main()
{
	map<char, string> mymap;

	mymap['a'] = "an element";
	mymap['b'] = "another element";
	mymap['c'] = mymap['b'];

	cout << "mymap['a'] is " << mymap['a'] << '\n';
	cout << "mymap['b'] is " << mymap['b'] << '\n';
	cout << "mymap['c'] is " << mymap['c'] << '\n';
	cout << "mymap['d'] is " << mymap['d'] << '\n';

	cout << "mymap now contains " << mymap.size() << " elements.\n";

	return 0;
}

注意,最后一次访问元素'd'时,使用该键在map中插入了一个新元素,并初始化为其默认值(空字符串),尽管访问它只是为了获取其值。而成员函数map::find不会产生这种效果。

6.multimap

1. Multimaps是关联式容器,它按照特定的顺序,存储由key和value映射成的键值对<key,
value>,其中多个键值对之间的key是可以重复的。

2. 在multimap中,通常按照key排序和惟一地标识元素,而映射的value存储与key关联的内
容。key和value的类型可能不同,通过multimap内部的成员类型value_type组合在一起,
value_type是组合key和value的键值对:
typedef pair<const Key, T> value_type;

3. 在内部,multimap中的元素总是通过其内部比较对象,按照指定的特定严格弱排序标准对
key进行排序的。

4. multimap通过key访问单个元素的速度通常比unordered_multimap容器慢,但是使用迭代
器直接遍历multimap中的元素可以得到关于key有序的序列。

5. multimap在底层用二叉搜索树(红黑树)来实现。

注意:multimap和map的唯一不同就是:map中的key是唯一的,而multimap中key是可以
重复的。multimap未重载[ ](因为允许存在多个key)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++:主要的关联容器类型:map 的相关文章

  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • 【ROS】完美解决ros-noetic-desktop-full安装速度慢的问题

    答主使用的是Ubuntu18 04 6LTS版本 安装配置ROS环境下载软件包时 sudo apt install ros noetic desktop full 出现下载速度极慢的情况 尝试网上所说的切换为手机热点的方法没什么用处 如果只
  • 利用条件编译预处理命令高效注释C/C++代码

    大段注释代码比较麻烦 本文介绍如何利用条件编译预处理命令高效注释C C 代码 注释代码 使用下面语句即可实现代码的大段注释 如果需要继续使用这些代码 将 if 0 改为 if 1 即可实现 if 0 endif 另一种处理方法 自己这几次的
  • mysql创建新用户并授权

    我们在使用mysql的过程中 经常需要对用户授权 添加 修改 删除 在mysql当中有三种方式实现 分别是 INSERT USER表的方法 CREATE USER的方法 GRANT的方法 今天主要看一下grant方法是如何实现的 分两种情况
  • LeetCode-二叉树的下一个节点

    如果当前节点有右儿子 则右子树中最左侧的节点就是当前节点的后继 比如F的后继是H 如果当前节点没有右儿子 则需要沿着father域一直向上找 找到第一个是其father左儿子的节点 该节点的father就是当前节点的后继 比如当前节点是D
  • Python中数组切片[:2],[1:],[2::-1]

    一维数组 一个参数 a i 返回与该索引相对应的单个元素 两个参数 b a i j i缺省时默认为0 即 a n 代表列表中的第一项到第n项 j缺省时默认为len alist 即a m 代表列表中的第m 1项到最后一项 当i j都缺省时 a
  • 电力系统

    欢迎来到本博客 目前更新 电力系统相关知识 期刊论文 算法 机器学习和人工智能学习 支持 如果觉得博主的文章还不错或者您用得到的话 可以关注一下博主 如果三连收藏支持就更好啦 这就是给予我最大的支持 本文目录如下 目录 1 概述 2 数学模
  • 使用chatGPT + AI 绘图生成自己的专属头像

    案例介绍 微信头像是朋友认识我们时的第一印象 或许是可爱 妖娆 或许是帅气 成熟 还有自然 厚重 调皮 我们都有自己独特的故事 独特的思想 独特的爱好 对于头像当然有着自己独到的设计眼光 接下来请允许我向大家展示如何使用chatGPT AI
  • 手把手教你独立完成毕业设计程序!

    又到一年毕业季 大多数计算机院校的毕业生需要开发出一个小项目来完成自己的毕业设计 大学没认真学 代码不是很会写 有一定基础 那么毕业设计程序的确很让人头疼 很多人开始通过各种方式来获取毕业设计程序代码 自己懂的 其实我们花点时间做出所谓毕业
  • 如何通俗理解设计模式及其思想?

    本文由玉刚说写作平台提供写作赞助 原作者 却把清梅嗅 版权声明 本文版权归微信公众号玉刚说所有 未经许可 不得以任何形式转载 术与道 数据结构 算法 设计模式被认为是程序员必备技能的三叉戟 如果说编程语言的语法特性和业务编码能力是 术 那么
  • 【SSH】~/.ssh/config 基本配置

    Host example com HostName 203 0 113 1 Port 2222 User myusername IdentityFile ssh id rsa 下面是一些常见的配置选项 HostName 指定要连接的远程主机
  • React 4 种状态类型及 N 种状态管理

    React 是一个视图层框架 其核心思想是 UI f state 即 UI 是 state 的投影 state 自上而下流动 整个 React 组件树由 state 驱动 当一个 React 应用程序足够复杂 组件嵌套足够深时 组件树中的状
  • VUE前后分离调起微信支付

    第一步 VUE 需要安装 微信支付模块 npm install weixin js sdk 加入需要引入的模块 import wx from weixin js sdk 第二步 封装 微信支付方法 wexinPay data cb erro
  • ssh实现ubuntu免密登录

    生成公钥和私钥 ssh keygen 按三下ENTER 公私钥默认保存在 ssh 文件夹中 cd ssh 发送公钥给另一台电脑 ssh copy id 用户名 ip 然后通过ssh链接就不需要输入密码了
  • .PLY文件格式剖析(二)

    在很多书上介绍的三维图形数据都是 obj 3ds格式 dxf等格式的 真正讲解如何读取的就只有 obj格式文件的 但是我现在所做的内容 要求从 ply文件中读取初始塞维图形数据 这我就不会了 虽然对 ply文件格式有了了解 Ply文件格式是
  • Android GB28181接入端实时位置订阅和上报之-如何获取当前经纬度

    我们在做Android平台GB28181的时候 其中实时位置 MobilePosition 订阅和上报这块 涉及到实时经纬度的获取 特别是执法记录 车载系统的那个等场景 几乎就是标配 今天主要是分享一段实时获取位置的代码 CameraPub
  • 详解Ubuntu配置VSCode+CMake的C++开发环境

    搬运自详解Ubuntu18 04配置VSCode CMake的C 开发环境 Python技术站 原文写18 04 亲测20 04也能用 学slam十四讲的宝宝可以用这个方法去跑一下里面的代码 本文将会介绍如何在Ubuntu 配置VSCode
  • (一)Python数据类型

    1 字符串 使用单引号 使用双引号 使用三引号 2 布尔类型 bool False bool True 3 整数 int 20 4 浮点数 float 2 3 5 数字 int x base 将x转换为一个整数 float x 将x转换到一
  • C++递推经典案例No.3——爬楼梯的最小代价

    数组的每个下标作为一个阶梯 第 i 个阶梯对应着一个非负数的体力花费值 cost i 下标从 0 开始 每当爬上一个阶梯都要花费对应的体力值 一旦支付了相应的体力值 就可以选择向上爬一个阶梯或者爬两个阶梯 请找出达到楼层顶部的最低花费 在开
  • 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见 https blog csdn net mrcrack article details 86501716 信息学奥赛一本通 C 版 刷题 记录 http ybt ssoier cn 8088 http blog csdn net
  • C++:主要的关联容器类型:map

    目录 1 关联式容器 2 键值对 3 树形结构的关联式容器 4 map的特点 5 使用map 常用接口的使用 1 find 2 insert 3 erase 4 operator 6 multimap 1 关联式容器 与vector lis