map和set使用讲解

map的使用

map的介绍

  • map是C++ STL(标准模板库)中的一个关联容器。

  • 它提供了一种有序的键值对存储方式,其中每个元素都由一个键和一个值组成。

  • map中的元素根据键的值自动进行排序,并且通过键快速访问对应的值。

  • map使用红黑树数据结构来实现内部的存储和排序。

  • 红黑树是一种平衡二叉搜索树,可以保证插入、删除和查找操作的时间复杂度都是对数级别(O(logn))

insert接口的使用

  • 插入单个键值对:

std::map<int, std::string> myMap;
myMap.insert(std::make_pair(1, "apple"));
  • 使用emplace函数插入新的键值对:

std::map<int, std::string> myMap;
myMap.emplace(3, "orange");

emplace函数是C++11引入的新特性,可以在插入时直接构造键值对。 需要注意的是,如果插入的键已经存在于map中,则insert函数不会插入新的键值对,而是返回一个std::pair类型的迭代器,指向已经存在的键值对。

  • 使用迭代器对一组数据进行插入

 string str[10] = { "数据1","数据2","数据3" ,"数据4" ,
  "数据5" ,"数据6" ,"数据7" ,"数据8" ,"数据9" ,"数据10" };
 vector<pair<string, int>> p1 = { {"数据1",1},{"数据2",2}, {"数据3",3}, {"数据4",4} ,{"数据5",5} ,{"数据6",6} ,{"数据7",7} ,{"数据8",8} ,{"数据9",9}, {"数据10",10} };
 mp1.insert(p1.begin(),p1.end());


只需要给定数据容器的迭代器,编译器便会遍历插入

erase

  • map的erase函数用于删除map中指定键对应的元素。它提供了多个重载版本,可以根据不同的需求进行使用。

  • 删除单个键值对:

std::map<int, std::string> myMap;
myMap.insert(std::make_pair(1, "apple"));
myMap.insert(std::make_pair(2, "banana"));
myMap.erase(1);

上述代码将删除键为1的键值对。调用erase函数时,传入要删除的键作为参数。

  • 使用迭代器删除元素:

std::map<int, std::string> myMap;
myMap.insert(std::make_pair(1, "apple"));
myMap.insert(std::make_pair(2, "banana"));
auto it = myMap.find(1);
if (it != myMap.end()) {
    myMap.erase(it);
}

上述代码通过先使用find函数查找到要删除的键对应的迭代器,然后调用erase函数来删除元素。

  • 删除一定范围内的元素:

std::map<int, std::string> myMap;
myMap.insert(std::make_pair(1, "apple"));
myMap.insert(std::make_pair(2, "banana"));
myMap.insert(std::make_pair(3, "orange"));
myMap.erase(myMap.begin(), myMap.find(2));

find接口的使用

  • map的find函数用于在map中查找指定键对应的元素。它返回一个迭代器,指向该键对应的元素,如果键不存在,则返回end迭代器。

std::map<int, std::string> myMap;
myMap.insert(std::make_pair(1, "apple"));
myMap.insert(std::make_pair(2, "banana"));
myMap.insert(std::make_pair(3, "orange"));
auto it = myMap.find(2);
if (it != myMap.end()) {
    std::cout << "Key found! Value is: " << it->second << std::endl;
} else {
    std::cout << "Key not found!" << std::endl;
}
  • 上述代码中,我们创建了一个map,并向其中插入了一些键值对。然后,使用find函数查找键为2的元素。如果找到了该键,打印对应的值;如果未找到,输出"Key not found!"。find函数返回的是一个迭代器,指向找到的元素。如果键不存在于map中,则返回end迭代器,它指向map中最后一个元素之后的位置。

clear接口的使用

  • map的clear函数用于删除map中的所有元素,使其成为空map。使用clear函数不会改变map的容量,只是将其中的键值对全部删除。

std::map<int, std::string> myMap;
myMap.insert(std::make_pair(1, "apple"));
myMap.insert(std::make_pair(2, "banana"));
myMap.insert(std::make_pair(3, "orange"));
myMap.clear();

上述代码中,我们创建了一个map,并向其中插入了一些键值对。然后,调用clear函数将所有元素都删除。

map的应用

  • 当成计数数组使用

  • 快速查找

set的使用

set的介绍

  • STL中的set是一种有序的关联容器

  • 它基于红黑树的数据结构实现。

  • set的特点如下:

  1. 唯一性:set中的元素是唯一的,不允许重复。如果尝试向set中添加已经存在的元素,操作将被忽略。

  2. 有序性:set中的元素按照一定的顺序进行存储,默认情况下是升序排列。可以通过自定义比较函数来改变排序方式。

  3. 快速插入与删除:set对插入和删除操作具有高效性能。红黑树结构可以自动调整以保持平衡,从而保证了常数时间复杂度的插入和删除操作。

  4. 快速查找:set内部使用二叉搜索树(红黑树)实现,使得查找操作具有很高的效率。平均情况下的时间复杂度为O(log n)。

  5. 提供迭代器支持:可以使用迭代器遍历set中的元素,支持正向和反向迭代。

insert接口的介绍

  • 可以使用insert()方法向set中添加元素。如果添加的元素已经存在于set中,则不会有任何变化。

mySet.insert(4);  // 添加元素4到set中

erase和clear接口的介绍

  • 可以使用erase()方法从set中删除指定的元素。如果指定的元素不存在于set中,不会有任何变化。另外,还可以使用clear()方法清空set中的所有元素。

mySet.erase(3);  // 从set中删除元素3
mySet.clear();  // 清空set中的所有元素

find接口的介绍

  • 可以使用find()方法来查找set中的元素。如果找到了指定元素,返回指向该元素的迭代器;否则返回set的end()迭代器。

auto it = mySet.find(2);  // 查找元素2
if (it != mySet.end()) 
{
    // 元素存在
} 
else 
{
    // 元素不存在
}

set的应用

  • 它在去重、成员关系判断和集合运算等方面都有广泛的应用。

  • 要注意,set对于元素的插入和删除操作会导致树结构的调整,因此在某些情况下可能比unordered_set(哈希表实现)慢一些。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SD-WAN解决跨国公司海外工厂网络安全问题

在跨境业务蓬勃发展的今天&#xff0c;越来越多的大型企业出于人力成本的考虑&#xff0c;在人力成本较低的发展中国家建立工厂。然而&#xff0c;传统基于路由器的网络架构已无法为这些跨国企业提供可靠的安全网络。那么&#xff0c;如何解决跨国企业海外工厂的网络难题呢&…

Structured_Streaming和Kafka整合

结构化编程模型 输出终端/位置 默认情况下&#xff0c;Spark的结构化流支持多种输出方案&#xff1a; 1- console sink: 将结果数据输出到控制台。主要是用在测试中&#xff0c;并且支持3种输出模式 2- File sink: 输出到文件。将结果数据输出到某个目录下&#xff0c;形成文…

数据绑定,defineProperty,v-on,事件处理

目录​​​​​​​ v-bind单向数据绑定 defineProperty 是v-on的简写 事件处理 v-bind单向数据绑定 从name绑定到v-bind到value单向数据绑定&#xff1a; <input type"text" :value"name"> <input type "text" v-model"na…

【Spring】SpringBoot 统一功能处理

文章目录 前言1. 拦截器1.1 什么是拦截器1.2 拦截器的使用1.2.1 自定义拦截器1.2.2 注册配置拦截器 1.3 拦截器详解1.3.1 拦截路径1.3.2 拦截器执行流程1.3.3 适配器模式 2. 统一数据返回格式3. 统一异常处理 前言 在日常使用 Spring 框架进行开发的时候&#xff0c;对于一些板…

什么是Java泛型?泛型在Java中应用场景

目录 一、什么是Java泛型 二、泛型类 三、泛型接口 四、泛型方法 一、什么是Java泛型 Java泛型是一种在编译时进行类型检查和类型安全的机制。它允许编写能够操作多种类型的代码&#xff0c;而不需要进行类型转换或使用Object类型。通过在定义类、接口或方法时使用泛型参数…

Arduino快速上手esp8266方案开发

认识ESP8266 ESP8266 是 Espressif Systems 生产的 Wi-Fi 片上系统 (SoC)。它非常适合物联网和家庭自动化项目&#xff0c;目前有非常高的市场普及率&#xff0c;还有更加高端的同时支持wifi和蓝牙的双核心芯片ESP32&#xff0c;可以在乐鑫官网查看完整的芯片列表。 ESP8266芯…

克服大模型(LLM)部署障碍,全面理解LLM当前状态

近日&#xff0c;CMU Catalyst 团队推出了一篇关于高效 LLM 推理的综述&#xff0c;覆盖了 300 余篇相关论文&#xff0c;从 MLSys 的研究视角介绍了算法创新和系统优化两个方面的相关进展。 在人工智能&#xff08;AI&#xff09;的快速发展背景下&#xff0c;大语言模型&…

element中el-cascader级联选择器只有最后一级可以多选

文章目录 一、前言二、实现2.1、设置popper-class和multiple2.2、设置样式 三、最后 一、前言 element-ui中el-cascader级联选择器只有最后一级可以多选&#xff0c;其它级只有展开子节点的功能&#xff0c;如下图所示&#xff1a; 可以观察到最后一级的li节点上没有属性aria-…

Python爬虫—requests模块简单应用

Python爬虫—requests模块简介 requests的作用与安装 作用&#xff1a;发送网络请求&#xff0c;返回响应数据 安装&#xff1a;pip install requests requests模块发送简单的get请求、获取响应 需求&#xff1a;通过requests向百度首页发送请求&#xff0c;获取百度首页的…

MATLAB R2023b for Mac 中文

MATLAB R2023b 是 MathWorks 发布的最新版本的 MATLAB&#xff0c;适用于进行算法开发、数据可视化、数据分析以及数值计算等任务的工程师和科学家。它包含了一系列新增功能和改进&#xff0c;如改进了数据导入工具&#xff0c;增加了对数据帧和表格对象的支持&#xff0c;增强…

pr怎么剪掉不要的部分?

在我们的日常工作中&#xff0c;剪视频的时候常常会需要把某个视频中我们不想要的地方剪掉&#xff0c;有的时候是一段&#xff0c;也有可能是好几段。但具体应该怎么样把不要的视频剪掉呢&#xff1f;其实&#xff0c;用pr软件就可以啦&#xff01;那么&#xff0c;pr怎么剪掉…

微信小程序开发WebSocket通讯

官方文档说明&#xff1a;入口 WebSocket连接的链接只支持wss加密方式&#xff0c;且只能用域名的方式 该域名还要在微信公众平台的小程序中登记才能使用&#xff0c;开发->开发管理->服务器域名->修改 该域名要和https使用的一致 以域名地址&#xff1a;dtu.aab…

2024年第02周农产品价格报告

一、摘要 农产品价格监测主要涉及对畜禽类产品、水产品、蔬菜类产品、水果类产品的价格&#xff0c;以周为单位&#xff0c;进行变化情况的数据监测。其中&#xff0c;蔬菜类产品共18种&#xff0c;分别为大白菜、西红柿、黄瓜、青椒、芹菜、土豆、白萝卜、茄子、豆角、胡萝卜…

华媒舍:高效率的新闻资讯新闻媒体宣发套餐内容推广计划方案

怎样让自己的新闻资讯可以被大众孰知&#xff0c;变成了每一个新闻媒体宣发者一同存在的困难。下面我们就给大家介绍一套高效率的新闻资讯新闻媒体宣发套餐内容推广计划方案&#xff0c;致力于帮助新闻媒体宣发者提升宣发高效率&#xff0c;提高新闻资讯的传播性。 1.新闻媒体宣…

如何通过内网穿透实现公网访问Portainer管理监控Docker容器

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer 公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风…

GoZero微服务个人探究之路(二)Go-Zero官方api demo示例探究

官方文档api-demo教程部分网址如下&#xff1a; api demo 代码生成 | go-zero Documentation 官方demo的架构如下&#xff1a; 编辑 etc包下&#xff1a; demo-api.yaml 编辑服务名称&#xff1a;demo-apiHOST地址&#xff1a;0.0.0.0监听所有可用网络接口Port地址&#…

XSKY助力首个云原生、分布式、全栈国产化银行核心系统投产上线

近日&#xff0c;。该项目是业内首个实际投产的云原生、分布式、全栈国产化的银行核心业务系统&#xff0c;是金融科技领域突破关键核心技术应用的重大实践。 在杭州银行的新一代核心系统中&#xff0c;XSKY星辰天合具备天合翔宇“一池多芯”技术的对象存储支持了核心业务模块…

每日一题 82. 删除排序链表中的重复元素 II(中等,链表)

和昨天差不多&#xff0c;今天的是把所有重复数字的节点都删除&#xff08;昨天留了一个&#xff09; 显然当我们发现重复数字时&#xff0c;需要重复的第一个数字的前一个节点才能把重复数字删完&#xff0c;所有在while循环中我们每次判断 t.next 和 t.next.next 的值是否重复…

AI模型理解误区:微调垂直行业-VS-企业专属知识库或AI助理

概述 企业定制私有化大模型的区别&#xff0c;分为训练大模型和调用大模型两种方向&#xff0c;以及企业自己的智能客服的实现方法。 - 企业定制的私有化大模型与一般的大模型不同&#xff0c;需要高成本训练。- 企业可以选择调用已经训练好的大模型来应用。- 企业可以使用向量…

Zabbix监控(1)

目录 一.什么是zabbix Zabbix 组件&#xff1a; 主动模式&#xff1a; 被动模式&#xff1a; Zabbix 工作原理&#xff1a; zabbix 监控原理&#xff1a; 二.Zabbix 6.0 部署 先安装nginx&#xff0c;php&#xff08;yum源安装&#xff09;&#xff1a; 安装nginx&…