当前位置: 首页 > 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…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

Visual Studio Code 扩展

Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后&#xff0c;命令 changeCase.commands 可预览转换效果 EmmyLua…...

【记录坑点问题】IDEA运行:maven-resources-production:XX: OOM: Java heap space

问题&#xff1a;IDEA出现maven-resources-production:operation-service: java.lang.OutOfMemoryError: Java heap space 解决方案&#xff1a;将编译的堆内存增加一点 位置&#xff1a;设置setting-》构建菜单build-》编译器Complier...