当前位置: 首页 > news >正文

【C++打怪之路Lv16】-- map set

🌈 个人主页:白子寰
🔥 分类专栏:重生之我在学Linux,C++打怪之路,python从入门到精通,数据结构,C语言,C语言题集👈 希望得到您的订阅和支持~
💡 坚持创作博文(平均质量分82+),分享更多关于深度学习、C/C++,python领域的优质内容!(希望得到您的关注~)

序列式容器和关联式容器

序列容器如string、vector等存储线性数据,元素按存储顺序访问

关联容器如map、set基于红黑树实现,提供基于关键字的存储和访问

其中set存储唯一关键字(对应key模型),map存储键值对(对应key/value模型)



set系列的使用

set和multiset参考文档

<set> - C++ Reference


set类的介绍

set声明采用类型T,需支持小于比较或自定义比较函数

底层使用红黑树存储,内存由空间配置器管理,可选自定义。

通常无需指定后两个模板参数

set操作效率为O(log n),迭代器按中序遍历提供有序访问。


set的使用

insert && 范围for && 迭代器


find查找区别 && count


lower_bound && upper_bound 


multiset 


multiset和set的差异

在C++中,set和multiset都是关联容器,用于存储已排序的数据集合。

它们的主要区别在于它们对键值(或元素)的重复性的处理方式

  • set

set容器中不允许有重复的元素。每个元素都是唯一的。
当尝试插入一个已经在set中存在的元素时,插入操作将失败,并且容器保持不变。
set通常实现为一个红黑树,这意味着在set中查找、插入和删除操作的时间复杂度通常是O(log n)

  • multiset

multiset容器允许存储重复的元素。
在multiset中可以插入相同的元素多次,每个元素都会被独立存储。
与set一样,multiset也是基于红黑树实现的,因此它也提供了对元素的排序,并且查找、插入和删除操作的时间复杂度通常是O(log n)

  • 查找操作

在set中,由于元素唯一,find操作会返回指向找到元素的迭代器,或者如果没有找到则返回end()迭代器。
在multiset中,find操作同样可以用来查找元素,但由于可能有多个相同的元素,它只保证返回一个匹配元素的迭代

  • 删除操作

在set中,erase操作会删除指定的元素(如果存在),并且由于元素唯一,只会删除一个匹配的元素。
在multiset中,erase操作可以删除所有匹配的元素,或者只删除一个特定的实例


选择使用set还是multiset取决于你的具体需求:

如果你需要确保元素的唯一性,应该使用set

如果你需要存储多个相同的元素并保持它们的排序,则应该使用multiset



map系列的使用

map和multiset参考文档

<map> - C++ Reference


map类的介绍

C++中的map类是一种关联容器,它存储键值对,其中键是唯一的,而值则可以是重复的。map类属于STL(标准模板库)的一部分,它按照键的升序自动排序。

以下是map类的一些基本特性和用法:

特性

  1. 键的唯一性:在map中,每个键都是唯一的,不能有重复的键。
  2. 自动排序map根据键的值自动排序,默认是升序。
  3. 键值对存储map存储键值对,可以通过键快速访问对应的值。
  4. 红黑树实现map通常是基于红黑树实现的,这意味着插入和查找操作的时间复杂度为O(log n)

map的使用

map的四种插入方式、迭代器的使用及范围for

void Test1()
{map<string, string> dict;// 一、pair<string, string> kv1 = {"left", "左边"};dict.insert(kv1);// 二、dict.insert(pair<string, string>("right", "右边"));// 三、dict.insert(make_pair<string, string>("up", "上边"));// 四、dict.insert({ "down","下边" });// 五、map<string, string> dict1 = { {"left", "左边"},{"right", "右边"},{"up", "上边"},{"down","下边"} };// 迭代器map<string, string>::iterator it = dict.begin();while (it != dict.end()){cout << (*it).first << ":" << (*it).second << endl;++it;}cout << endl;// 范围for①for (auto& e : dict1){cout << e.first << ":" << e.second << endl;}cout << endl;// 范围for②for (auto& [x, y] : dict1){cout << x << ":" << y << endl;}
}


map简单字典的实现

int main()
{map<string, string> dict = { { "left","左边" }, { "right","右边" }, { "up","上边" }, { "down","下边" } };string str;while (cin >> str){auto ret = dict.find(str);if (ret != dict.end()){cout << "-->" << ret->second << endl;}else{cout << "查无此单词" << endl;}}return 0;
}

 CTRL + Z 退出


使用map对于水果(牛奶)的计数 

int main()
{string arr[] = { "苹果","香蕉","牛奶","苹果","香蕉","苹果","牛奶" };map<string, int> CountFruit;for (auto& str : arr){auto ret = CountFruit.find(str);if (ret == CountFruit.end()){CountFruit.insert({ str,1 });}else{ret->second++;}}for (auto& e : CountFruit){cout << e.first << " : " << e.second << endl;}return 0;
}


multimap和map的差异

multimap和map在C++中都是关联容器,用于存储键值对,但它们之间有几个关键差异:

  • 唯一性

map:在map中,每个键必须是唯一的。如果你尝试插入一个具有相同键的元素,它将替换掉具有相同键的现有元素。
multimap:与map不同,multimap允许键重复。因此,你可以有多个具有相同键的元素。

  • 实现方式

map:通常是基于红黑树实现的,这使得元素按照键的升序排列,并保证查找、插入和删除操作的时间复杂度为O(log n)。
multimap:同样基于红黑树实现,但由于允许多个相同键的存在,其行为略有不同。

  • 操作

插入:

对于map,插入操作会检查键是否已存在,如果存在则替换旧值。

对于multimap,插入操作不会检查键的唯一性,因此可以插入多个相同键的元素
查找:

在map中,你可以使用find()函数查找特定的键,并且最多只能找到一个匹配项。

在multimap中,find()函数将返回第一个匹配的键值对,但你可能需要使用equal_range()函数来找到所有具有相同键的元素。
删除:

在map中,使用erase()函数可以删除具有特定键的单个元素。

在multimap中,erase()函数可以删除具有特定键的所有元素,或者你可以指定一个迭代器来删除单个元素。

  • 总结

选择map还是multimap取决于你的具体需求。

如果你需要每个键对应唯一的值,那么应该使用map

如果你需要存储具有相同键的多个值,那么应该使用multimap



**********************************************************分割线*****************************************************************************
完结!!!
感谢浏览和阅读。

等等等等一下,分享最近喜欢的一句话:

“万年太久,只争朝夕”。

我是白子寰,如果你喜欢我的作品,不妨你留个点赞+关注让我知道你曾来过。
你的点赞和关注是我持续写作的动力!!! 
好了划走吧。

相关文章:

【C++打怪之路Lv16】-- map set

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;重生之我在学Linux&#xff0c;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持…...

TPU-MLIR 项目源码结构分析

TPU-MLIR 项目源码结构分析 本文用作学习记录和交流分享&#xff0c;主要内容为 TPU-MLIR 的源码框架分析和构建流程分析。源码地址&#xff1a;https://github.com/sophgo/tpu-mlir 文件结构 从最外层开始分析 envsetup.sh 该脚本用于配置和初始化开发环境&#xff0c;其中…...

IDEA Maven 打包找不到程序包错误或找不到符号,报错“程序包不存在“

参考文章&#xff1a;https://blog.csdn.net/yueeryuanyi/article/details/14211090 问题&#xff1a;IDEA Maven 打包找不到程序包错误或找不到符号,报错“程序包不存在“编译都没问题 解决思路 – >【清除缓存】 1. 强制刷新Maven缓存 选择 Maven 标签&#xff0c;Exe…...

Sourcetree:一款强大的Git客户端

Sourcetree&#xff1a;一款强大的Git客户端 Sourcetree是一款由Atlassian开发的免费Git客户端&#xff0c;它提供了一个直观的图形界面&#xff0c;让用户能够轻松地管理他们的版本控制系统。无论是初学者还是有经验的开发者&#xff0c;Sourcetree都能提供方便快捷的Git操作…...

Linux环境变量与本地变量

文章目录 Linux环境变量与本地变量什么是环境变量查看环境变量设置环境变量本地变量命令行参数 Linux环境变量与本地变量 什么是环境变量 操作系统或运行时环境中存储的一些变量&#xff0c;用来存储与进程或系统相关的配置信息。这些变量在进程启动时由操作系统或Shell读取&…...

ChatGPT的应用场景:开启无限可能的大门

ChatGPT的应用场景:开启无限可能的大门 随着人工智能技术的快速发展,自然语言处理领域迎来了前所未有的突破。其中,ChatGPT作为一款基于Transformer架构的语言模型,凭借其强大的语言理解和生成能力,在多个行业和场景中展现出了广泛的应用潜力。以下是ChatGPT八个最具代表…...

QT按下两次按钮,保存这期间内变换的QtextEdit控件内的数据

这个功能在项目中很常见&#xff0c;对界面里某个控件的数据进行记录&#xff0c;我这个是每秒记录5次&#xff0c;实际就是每200ms触发一次定时器&#xff0c;来满足需求。 .h文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QtSerialPort> …...

daos源码编译

1. 前言 本文详细介绍如何在almalinux8.9上编译daos.2.0.0源码。系统环境如下&#xff1a; daos: 2.0.0 linux os: almalinux 8.9 linux kernel: 4.18.0-513.5.1.el8_9.x86_64之所以选择2.0.0版本&#xff0c;是因为daos从2.0.0开始是一个全新的架构设计&a…...

HTML飞舞的爱心

目录 系列文章 写在前面 完整代码 代码分析 写在后面 系列文章 序号目录1HTML满屏跳动的爱心&#xff08;可写字&#xff09;2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐5HTML蓝色爱心射线6HTML跳动的爱心&#xff08;简易版&#xff09;7HTML粒子爱心8HTML蓝色…...

C++中智能指针的使用及其原理 -- RAII,内存泄漏,shared_ptr,unique_ptr,weak_ptr

目录 1.智能指针的使用场景分析 2.RAII和智能指针的设计思路 3.C标准库智能指针的使用 4.智能指针的原理以及模拟实现 5.shared_ptr循环引用问题和weak_ptr 5.1shared_ptr循环引用问题 5.2weak_ptr的原理和部分接口 5.3weak_ptr的简单模拟实现 6. shared_ptr的线程安…...

Linux服务器安装mongodb

因为项目需要做评论功能&#xff0c;领导要求使用mongodb&#xff0c;所以趁机多学习一下。 在服务器我们使用docker安装mongodb 1、拉取mongodb镜像 docker pull mongo &#xff08;默认拉取最新的镜像&#xff09; 如果你想指定版本可以这样 docker pull mongo:4.4&#…...

Android11修改摄像头前后置方法,触觉智能RK3568开发板演示

本文介绍在Android11系统下&#xff0c;修改摄像头前后置属性的方法。使用触觉智能EVB3568鸿蒙开发板演示&#xff0c;搭载瑞芯微RK3568&#xff0c;四核A55处理器&#xff0c;主频2.0Ghz&#xff0c;1T算力NPU&#xff1b;支持OpenHarmony5.0及Linux、Android等操作系统&#…...

leetcode 212. 单词搜索 II

给定一个 m x n 二维字符网格 board 和一个单词&#xff08;字符串&#xff09;列表 words&#xff0c; 返回所有二维网格上的单词 。 单词必须按照字母顺序&#xff0c;通过 相邻的单元格 内的字母构成&#xff0c;其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一…...

Taro 鸿蒙技术内幕系列(三) - 多语言场景下的通用事件系统设计

基于 Taro 打造的京东鸿蒙 APP 已跟随鸿蒙 Next 系统公测&#xff0c;本系列文章将深入解析 Taro 如何实现使用 React 开发高性能鸿蒙应用的技术内幕 背景 在鸿蒙生态系统中&#xff0c;虽然原生应用通常基于 ArkTS 实现&#xff0c;但在实际研发过程中发现&#xff0c;使用 C…...

《Docker Registry(镜像仓库)详解》

一、引言 在容器化技术日益普及的今天&#xff0c;Docker 已成为众多开发者和企业的首选工具。而 Docker Registry&#xff08;镜像仓库&#xff09;作为 Docker 生态系统中的重要组成部分&#xff0c;负责存储和分发 Docker 镜像。本文将深入探讨 Docker Registry 的概念、功能…...

AI前景分析展望——GPTo1 SoraAI

引言 人工智能&#xff08;AI&#xff09;领域的飞速发展已不仅仅局限于学术研究&#xff0c;它已渗透到各个行业&#xff0c;影响着从生产制造到创意产业的方方面面。在这场技术革新的浪潮中&#xff0c;一些领先的AI模型&#xff0c;像Sora和OpenAI的O1&#xff0c;凭借其强大…...

超级详细讲解转义字符,\? \‘ \f \0 \t等等!!!

C语言有一组特殊的字符称作转义字符&#xff0c;顾名思义&#xff0c;转变原来的意思 1 \? ??)是一个三字母词&#xff0c;在以前的编译器它会被编译为] (??会被编译为[ 因此在以前输入(are you ok ??)就会被编译为are you ok ] 解决这个问题只要在问号前输入\&#xf…...

微信小程序数据请求教程:GET与POST请求详解

微信小程序数据请求教程:GET与POST请求详解 引言 在微信小程序的开发过程中,数据请求是至关重要的一部分。通过与后端服务器进行通信,小程序能够获取动态数据,实现丰富的功能。在这篇文章中,我们将深入探讨微信小程序中的数据请求,重点介绍GET和POST请求的使用方法、示…...

Linux系统管理基础指南--习题

目录 一、基础知识与命令 二、 Linux的用户接口 三、文件权限与目录管理 四、shell相关知识 五、软件安装与网络 六、网络进程管理 一、基础知识与命令 1. (操作题)分别执行下述命令 ls -al cd ~ cd man -f man man –k cd man --help cal --help date --help bc --he…...

JVM(JAVA虚拟机)内存溢出导致内存不足,Java运行时环境无法继续

1、先贴出服务最后打印出来的日志&#xff0c;意思就是给虚拟机分配的内存被用完了&#xff0c;没有可用的内存了&#xff0c;服务运行不了了&#xff0c;被动停服了。详细的日志记录在了/home/user/zx/tomcat/apache-tomcat-8.5.82/bin/hs_err_pid147951.log文件里。 Java Ho…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...