C++ Primer 第五版 第十一章 关联容器

news2024/9/22 10:06:27

关联容器中的元素是按关键字来保存和访问的。

两个主要的关联容器类型是mapset

一、使用关联容器
使用map

当从map中提取一个元素时,会得到一个pair类型的对象。pair是一个模板类型,保存两个名为first和second的(公有)数据成员。map所使用的pair用first成员保存关键字,用second成员保存对应的值。

使用set

举例:统计单词出现次数时,忽略常见单词

当需要保存特定的值集合——通常是满足/不满足某种要求的值集合,用set最为方便,比如黑名单。

二、关联容器概述

关联容器不支持顺序容器的位置相关的操作,例如push_front或push_back。关联容器也不支持构造函数或插入操作这些接受一个元素值和一个数量值的操作。关联容器的迭代器都是双向的。

1. 定义关联容器

每个关联容器都定义了一个默认构造函数,它创建一个指定类型的空容器。

我们也可以将关联容器初始化为另一个同类型容器的拷贝,或者是从一个值范围来初始化关联容器,只要这些值可以转化为容器所需类型就可以。

初始化multimap或multiset

multimap和multiset允许多个元素具有相同的关键字。

2. 关键字类型的要求
有序容器的关键字

有序容器要求关键字类型必须支持比较操作<

可以提供自己定义的操作来代替关键字上的<运算符。比较函数的基本性质:

使用关键字类型的比较函数

用compareIsbn函数定义一个multiset。

3. pair类型

标准库类型pair定义在头文件utility中。

一个pair保存两个数据成员。当创建一个pair时,我们必须提供两个类型名,pair的数据成员将具有对应的类型。

与其他标准库类型不同,pair的数据成员是public的。两个成员分别命名为first和second。

创建pair对象的函数

三、关联容器操作

在一个map中,每个元素是一个pair对象,包含一个关键字和一个关联的值。由于我们不能改变一个元素的关键字,因此这些pair的关键字部分是const的。

1. 关联容器迭代器

set的迭代器是const的

与不能改变一个map元素的关键字一样,一个set中的关键字是const的。可以用一个set迭代器来读取元素的值,但不能修改。

遍历关联容器

map和set支持begin和end操作。我们可以用这些函数迭代器,然后用迭代器来遍历容器,

当使用一个迭代器遍历一个map、multimap、set或multiset时,迭代器按关键字升序遍历元素。

关联容器和算法

我们通常不对关联容器使用泛型算法。const这一特性意味着不能将关联容器传递给修改或重排容器元素的算法。关联容器可用于只读取元素的算法。

2. 添加元素

检测insert的返回值

insert(或emplace)返回的值依赖于容器类型和参数。对于不包含重复关键字的容器,添加单一元素的insert和emplace版本返回一个pair,告诉我们插入操作是否成功。pair的first成员是一个迭代器,指向具有给定关键字的元素;second成员是一个bool值,指出元素是插入成功还是已经存在于容器中。如果关键字已在容器中,则insert什么事也不做,且返回值中的vool部分为false。如果关键字不存在,元素被插入容器中,且bool值为bool。

向multiset或multimap添加元素

对允许重复关键字的容器,接受单个元素的insert操作返回一个指向新元素的迭代器。

3. 删除元素

4. map的下标操作

map和unordered_map容器提供了下标运算符和一个对应的at函数。set类型不支持下标。

当对一个map进行下标操作时,会获得一个mapped_type对象;但当解引用一个map迭代器时,会得到一个value_type对象。

map的下标运算符返回一个左值。由于返回的是一个左值,我们既可以读也可以写元素。

5. 访问元素

在multimap或multiset中查找元素

用lower_bound和upper_bound解决此问题:

调用equal_range解决此问题:

四、无序容器

无序容器使用哈希函数和关键字类型的==运算符来组织元素。

管理桶

无序容器在存储上组织为一组桶,每个桶保存零个或多个元素。无序容器使用一个哈希函数将元素映射到桶。无序容器的性能依赖于哈希函数的质量和桶的数量和大小,

如果一个桶中保存了很多元素,那么查找一个特定元素就需要大量比较操作。

无序容器提供了一组管理桶的操作。这些成员函数允许我们查询容器的状态以及在必要时强制容器进行重组。

无序容器对关键字类型的要求

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1678733.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3知识总结-4

Vue3知识总结-4 文章目录 Vue3知识总结-4插槽Slots渲染作用域默认内容具名插槽插槽中的数据传递具名插槽传递数据 组件声明周期声明周期示意图 组件生命周期的应用动态组件组件保持存活组件被卸载 异步组件依赖注入 插槽Slots 在某些场景中&#xff0c;可能想要为子组件传递一…

Hadoop Java API操作 及读取序列化文件(04-05-06)

针对于04-05-06班级整合。 1.创建java项目 2.修改pom.xml文件 添加依赖 <dependencies><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.1.4</version></dependenc…

react18【系列实用教程】memo —— 缓存组件 (2024最新版)

memo 的语法 如上图所示&#xff0c;在react中&#xff0c;当父组件重新渲染时&#xff0c;子组件也会重新渲染&#xff0c;即便子组件无任何变化&#xff0c;通过 memo 可以实现对组件的缓存&#xff0c;即当子组件无变化时&#xff0c;不再重新渲染子组件&#xff0c;核心代码…

leetcode刷题(6):二叉树的使用

文章目录 104. 二叉树的最大深度解题思路c 实现 94. 二叉树的中序遍历解题思路c 实现 101. 对称二叉树解题思路c 实现 96. 不同的二叉搜索树解题思路c 实现 102. 二叉树的层序遍历解题思路c 实现 104. 二叉树的最大深度 题目: 给定一个二叉树 root &#xff0c;返回其最大深度…

Git—安装及介绍

下载Git 官网地址&#xff1a;Git - Downloads (git-scm.com) 安装 双击安装包 点击 next 检查安装 桌面&#xff0c;右键鼠标&#xff0c;是否出现 Git GUI Here 和 Git Bash Here 打开Git Bash Here 输入命令 git --verison

LVS+Keepalived群集及搭建

LVSKeepalived群集及搭建 Keepalived 简介什么是Keepalived &#xff1f;Keepalived 的作用keepalived体系主要模块及作用Keepalived 选举策略选举策略priority 和 weight 的设定 Keepalived脑裂及解决方法部署LVSkeepalived高可用集群服务器准备配置NFS共享配置主DR服务器配置…

街道治安新利器:EasyCVR智能视频管理方案助力城市安全新高度

一、背景分析 随着城市化进程的加快和社会治安形势的日趋复杂&#xff0c;街道治安管理面临着前所未有的挑战。对于街道治安的管理&#xff0c;面临着街道上机动车、非机动车违停、游商摊贩、垃圾堆积、人员监管等问题&#xff0c;既影响市容市貌&#xff0c;又有安全隐患。传…

Python——Pandas的基本使用方法(1)

1.文件读写 图1-1 iris部分数据 图1-2 tips部分数据 图1-3 tips1部分数据 1.1 读取csv文件 —— read.csv() read.csv()部分参数的解释如下&#xff1a; 参数名称作用备注filepath_or_buffer要读取的文件路径或对象sep字段分隔符&#xff0c;默认为逗号delimiter字段分隔符与…

通过C++和libcurl下载网易云音乐音频文件的5个简单步骤

概述 在网络编程中&#xff0c;使用C和libcurl库下载文件是一项常见的任务。网易云音乐作为中国领先的在线音乐服务平台之一&#xff0c;以其丰富的音乐资源、优质的音质和智能推荐系统而广受欢迎。由于其平台提供了大量的正版音乐资源&#xff0c;用户在下载音频文件时可能会…

Pikachu 靶场 File Inclusion 通关解析

前言 Pikachu靶场是一种常见的网络安全训练平台&#xff0c;用于模拟真实世界中的网络攻击和防御场景。它提供了一系列的实验室环境&#xff0c;供安全专业人士、学生和爱好者练习和测试他们的技能。 Pikachu靶场的目的是帮助用户了解和掌握网络攻击的原理和技术&#xff0c;…

微信小程序的自定义组件

一、创建自定义组件 &#xff08;1&#xff09;定义&#xff1a; 把页面重复的代码部分封装成为一个自定义组件&#xff0c;以便在不同的页面中重复使用&#xff0c;有助于代码的维护。 &#xff08;2&#xff09;组成&#xff1a; 自定义组件的组成&#xff1a;json文件&a…

自学C语言能达到什么境界呢?

C 语言是一门广泛应用于系统软件、嵌入式系统、游戏开发等领域的编程语言。那么&#xff0c;通过自学 C 语言&#xff0c;能够达到什么样的境界呢&#xff1f; 就像学习小提琴一样&#xff0c;仅凭自学也可以达到一定的水平&#xff0c;能够自娱自乐&#xff0c;在亲友聚会时表…

python手写数字识别(PaddlePaddle框架、MNIST数据集)

python手写数字识别&#xff08;PaddlePaddle框架、MNIST数据集&#xff09; import paddle import paddle.nn.functional as F from paddle.vision.transforms import Compose, Normalizetransform Compose([Normalize(mean[127.5],std[127.5],data_formatCHW)]) # 使用tran…

软件确认测试详细介绍

在软件开发流程中&#xff0c;确认测试是一个至关重要的环节&#xff0c;它确保软件产品满足预定的需求、性能和质量标准。本文将详细介绍软件确认测试的概念、目的、方法、执行步骤以及其在软件开发周期中的重要性。   一、软件确认测试的概念   软件确认测试&#xff0c;…

SuperBox设计出图的效率提升!新增内门自动开孔和垫高支架图纸输出功能

越来越多的配电箱项目要求带内门&#xff0c;内门不仅可以有效减少外界灰尘、异物进入配电箱内部&#xff0c;保障配电箱正常运行&#xff0c;还能够隔离操作人员意外触摸导电部件&#xff0c;减少触电事故的发生。但是配电箱在配置内门后&#xff0c;会给设计带来更多的要求&a…

[图解]SysML和EA建模住宅安全系统-04

1 00:00:01,200 --> 00:00:04,710 我们首先来看一下需求图的一些要点 2 00:00:05,810 --> 00:00:07,080 需求图用来干什么 3 00:00:07,210 --> 00:00:12,080 用来记录文本形式的一些需求 4 00:00:12,090 --> 00:00:13,480 和需求的素材 5 00:00:14,540 --> …

【GESP】2023年12月图形化三级 -- 小杨做题

小杨做题 【题目描述】 为了准备考试,小杨每天都要做题。第 1 天,小杨做了 a a a 道题,第 2 天,小杨做了 b b b

GPT-4o: 从最难的“大海捞针”基准看起

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在阅读过程中有些知识点存在盲区&#xff0c;可以回到如何优雅的谈论大模型重新阅读。另外斯坦福2024人工智能报告解读为通识性读物。若对于如果…

高压无源探头能测整流桥电压吗?

高压无源探头是用于测量高电压电路中信号的一种工具&#xff0c;它不需要外部电源供电。然而&#xff0c;对于测量整流桥电压&#xff0c;需要考虑几个因素以确定是否可以使用高压无源探头。 首先&#xff0c;让我们了解一下整流桥的基本原理。整流桥是一种电路&#xff0c;用…

华为OD机试 - 反射计数 - 矩阵(Java 2024 C卷 200分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…