C++primer(第五版)第十一章(关联容器)

news2024/11/26 22:43:01

关联容器支持高效的关键字查找和访问.两个主要的关联容器是map和set(其他的都是这两个的变种).

map和multimap定义在头文件map中.set和multise定义在头文件set中.无序容器定义在头文件unordered_map和unordered_set中.

 11.1使用关联容器

map的元素类型为pair,包含两个部分,key和value,即键值对.定义map时需要指定键的类型以及值的类型.

map中不允许有相同的键名(关键字).

从map中提取元素时是得到一个pair类型的对象,可以使用first和second(数据成员)来获取map的键和值:

 set和map不一样的是set不存在值,而是只有键名(关键字),并且同样不允许关键字重复.

 由于set元素没有值,只有关键字,因此通过迭代获取set元素只需要直接解引用就可以(参考上例).

11.2关联容器概述

关联容器不支持顺序容器的位置相关的操作,例如push_front,push_back.因为关联容器的元素是根据关键字存储的,因此只能插入(insert).

11.2.1定义关联容器

初始化map可以参考我上面的代码,但是map和set都不允许有重复的关键字,但是编译器不会报错.重复定义的关键字不会存入map或set中.multimap或是multiset和maph,set不同的是它们可以有重复的关键字,因此初始化的时候就可以有多个相同的关键字.

11.2.2关键字类型的要求

关联有序容器(map,set,multimap,multiset)的关键字;类型必须有定义元素比较的方法,如果关键字是自己定义的类类型,那么就需要自己定义比较方法(重载比较运算符)并且关键字类型需严格弱序,

严格弱序:

两个关键字不能同时小于等于对方.

a小于等于b,b小于等于c,那么a小于等于c.

a等价于b,b等价于c,那么a等价于c.

(我感觉这种规定都挺直觉的,不用特地记起来)

如果用的是标准库提供的那就无需麻烦.因为关联有序容器是默认按照关键字升序来排序的,因此我们上面的代码用迭代器遍历map,set时可以看到关键字确实是按照升序打印出来的.

11.2.3 pair类型

pair是一个模板类型,它定义在头文件utility中.pair保存两个数据成员,两个数据的类型可以不一样.包含两个成员变量(first,second)分别为前后两个数据成员.

11.3关联容器操作

关联容器定了类型别名:

 对于set来说,key_type和value_type是一样的.

11.3.1关联容器迭代器

迭代map会得到pair,通过访问first和second来获取键和值,其中关键字是无法修改的,但是可以修改值.set的迭代器是const,因此不能通过set迭代器来修改set元素.

我们通常不会对关联容器使用泛型算法,就是因为上面的原因.

11.3.2添加元素

insert,emplace返回的值依赖于容器类型和参数 ,对于不包含重复元素的容器,添加单一元素的insert和emplace返回一个pair,first指向具有给定关键字的元素,second指向bool,来表示插入成功或是失败(容器中已经有相同的关键字的时候返回false).

而向multimap或multiset插入时,insert指向新元素的迭代器,因为插入永远是成功的(可以包含相同的关键字)

11.3.3删除元素

 11.3.4 map的下标操作

 使用[关键字]来访问map不会检查map是否含有关键字,如果直接访问或是操作未添加的关键字,那么会自动添加上此关键字,再进行默认初始化,最后再访问或是操作.使用at(关键字)则会检查,如果容器内没有关键字则会抛出异常.

使用下标访问对象,会直接返回值,而使用迭代器则会返回pair.

11.3.5访问元素

下表中lower_bound和upper_bound不适用于无序容器.

下标和at只适用于非const的map和unordered_map.

 在multimap或是multiset中有多个相同关键字时,它们会被放置在相邻位置.因此我们查询multimap或multiset时需要使用find和count.

 11.4无序容器

unordered开头的容器为无序容器,与有序容器不同的是,无序关联容器使用的是哈希函数和关键字类型的==运算符,而不是使用比较运算符来排序关键字,因此无序容器维护元素的序列代价远小于有序列表.因此,如果我们使用自定义类类型作为关键字则一个提供自己的哈希模板版本.

若是无需排序关键字,那么使用unordered_map/unordered_set则可以获得更快的查找数据(或许使用map超时的力扣题改用unordered_map就可以通过的呢)

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

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

相关文章

vue循环如何动态加载本地图片

显示效果&#xff1a; 代码&#xff1a; html&#xff1a; <el-tooltip :content"setTip(item)" placement"bottom"><img :src"setSrc(item)" alt"" width"20" height"20" /> </el-tooltip> …

flask+分页查询列表显示

import pymysqlfrom flask import Flask, render_template, requestapp Flask(__name__)app.debug Trueapp.route(/) def home():return render_template(Order_page.html)#查询数据以列表的形式返回查询结果 app.route(/Order_list, methods[POST]) def Order_list():db py…

LeetCode 2532 过桥的时间

题目链接 模拟: 因为各员工搬箱子这件事相互之间没有影响, 即一个员工 i i i开始从左往右过桥时, 可以产生两个事件: l e f t T o R i g h t i leftToRight_i leftToRighti​ 分钟后桥空闲(若两岸有再等待过桥的人, 应该按规则过桥) l e f t T o R i g h t i p i c k O l d …

c++编写网络爬虫

c爬虫项目 实现图形化界面UI 安装easyX&#xff08;需要用的graphisc.h&#xff09; 我之前的文章详细写到过如何安装。是这篇文章提到的&#xff1a;传送门 easyx官网 创建图形化界面 #define WINDOW_WIDTH 482 #define WINDOW_HEIGHT 300 void initUI() {initgraph(WINDO…

python 列表推导式、元组推导式 字典推导式 、三元运算符

一、基本语法结构 列表推导式的基本语法结构为&#xff1a; [ expression for item in iterable if condition ] 其中&#xff0c;expression表示参与列表生成的表达式&#xff0c;可包含变量、函数调用等操作&#xff1b;item表示生成列表中的元素&#xff1b;iterable表示…

Kubernetes中Pod的生命周期、重启策略

Kubernetes中Pod的生命周期、重启策略 1、Pod生命周期和重启策略 Pod 在整个生命周期中被系统定义为各种状态&#xff0c;熟悉 Pod 的各种状态对于理解如何设置 Pod 的调度策略、重启策 略是很有必要的&#xff0c;Pod 的状态如表所示。 Pod的重启策略(RestartPolicy)应用于…

Vue3项目Ant-Design-Vue汉化(a-date-picker等组件)

前言 Ant-Design-Vue 组件库某些组件默认是英文显示的&#xff0c;如时间选择等组件。这些组件的显示需要用户手动去进行汉化。 官方文档对此也给出了说明及示例&#xff0c;但截止到本篇博客发布日期&#xff0c;示例与实际项目配置存在小幅度出入。我也因此踩了一些坑&…

【Linux】文件描述符(下篇)

文章目录 &#x1f4d6; 前言1. 文件描述符fd的分配规则2. 重定向的本质3. 缓冲区的理解3.1 感受缓冲区的存在&#xff1a;3.2 正式认识缓冲区&#xff1a;综合例题&#xff1a; 4. 模拟实现C语言的文件操作5. 完善之前实现的shell5.1 程序替换&#xff0c;会影响曾经子进程打开…

机器学习技术(三)——机器学习实践案例总体流程

机器学习实践案例总体流程 文章目录 机器学习实践案例总体流程一、引言二、案例1、决策树对鸢尾花分类1.数据来源2.数据导入及描述3.数据划分与特征处理4.建模预测 2、各类回归波士顿房价预测1.案例数据2.导入所需的包和数据集3.载入数据集&#xff0c;查看数据属性&#xff0c…

【动态规划算法练习】day15

文章目录 一、01背包1.题目简介2.解题思路3.代码4.运行结果 二、416. 分割等和子集1.题目简介2.解题思路3.代码4.运行结果 三、494. 目标和1.题目简介2.解题思路3.代码4.运行结果 四、1049. 最后一块石头的重量 II1.题目简介2.解题思路3.代码4.运行结果 总结 一、01背包 1.题目…

【设计模式】第十三章:模板方法模式详解及应用案例

系列文章 【设计模式】七大设计原则 【设计模式】第一章&#xff1a;单例模式 【设计模式】第二章&#xff1a;工厂模式 【设计模式】第三章&#xff1a;建造者模式 【设计模式】第四章&#xff1a;原型模式 【设计模式】第五章&#xff1a;适配器模式 【设计模式】第六章&…

20.BeautifulSoup库的安装及导入

文章目录 1.BeautifulSoup库简介2.BeautifulSoup库的安装3.BeautifulSoup和beautifulsoup4的区别4.获取网页源代码知识回顾4.1 手动获取网页的源代码4.2 requests库获取网页的源代码 5. 利用bs4库输出网页源代码6.bs4库的导入语法 1.BeautifulSoup库简介 BeautifulSoup库是Pyt…

1.监控分布式--zabbix

文章目录 监控分布式-zabbix、prometheus概念工作原理功能组件部署zabbix安装Nginx和PHP环境部署数据库编码安装zabbix编译安装zabbix server客户端安装zabbix agent服务 监控分布式-zabbix、prometheus 利用一个优秀的监控软件&#xff0c;我们可以: 通过一个友好的界面进行…

NGINX+Tomcat负载均衡、动静分离集群

目录 前言 一、NGINX正向代理与反向代理 1.1、NGINX正向代理 1.2、NGINX反向代理 1. 2.1Nginx配置反向代理的主要参数 二、负载均衡 三、NGINX动静分离集群 3.1动静分离原理 四、NginxTomcat动静分离 4.1搭建nginx代理服务器192.168.14.100 4.1.1安装 NGINX依赖环境 …

创建UI组件库后上传NPM

上篇已经讲了如何创建自己的组件库&#xff0c;这篇讲怎么上传npm后&#xff0c;可以下载使用 1.首先看下组件的文件结构 在index.js中要写上每个组件可以按需引用的条件 import Button from "./src/button";Button.install function(Vue) {Vue.component(Button.…

Tkinter_使用Progressbar创建和管理进度条

前言 Progressbar是Tkinter库中的一个小部件&#xff0c;用于创建和管理进度条。它可以在图形用户界面中显示任务的进度&#xff0c;并提供了多种样式和配置选项。 使用Progressbar&#xff0c;你可以按照固定或不确定的进度展示任务的进行状态。它可以显示任务完成的百分比&am…

“this“ 隐式具有类型 “any“,因为它没有类型注释。

在 tsconfig.json文件中 将 "noImplicitThis" 改为false "noImplicitThis": false,

工业互联网如何促进传统制造业的高效生产?

工业互联网&#xff0c;也称为工业物联网&#xff08;IIoT&#xff09;&#xff0c;是指将联网设备和系统集成到传统制造流程中。它结合了传感器、数据分析、机器学习和自动化&#xff0c;以优化和提高制造各个方面的效率。工业互联网促进传统制造业高效生产的方式有&#xff1…

机器学习、监督学习、无监督学习基本概念

- 机器学习 机器学习是一门多领域交叉学科&#xff0c;涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为&#xff0c;以获取新的知识或技能&#xff0c;重新组织已有的知识结构使之不断改善自身的性能。机器学习有…

Nginx反向代理提示413 Request Entity Too Large

请求返回的内容如下 <html> <head><title>413 Request Entity Too Large</title></head> <body> <center><h1>413 Request Entity Too Large</h1></center> <hr><center>nginx/1.20.2</center>…