C++学习笔记:set和map

set和map

  • set
    • 什么是set
    • set的使用
  • 关联式容器
    • 键值对
  • map
    • 什么是map
    • map的使用
      • map的插入方式
      • 常用功能
      • map[] 的灵活使用

set

什么是set

set是STL中一个底层为二叉搜索树来实现的容器

  • 若要使用set需要包含头文件 #include<set>
  • set中的元素具有唯一性(因此可以用set去重)
  • 若用set的迭代器遍历,默认得到升序序列
  • set查找某个元素默认复杂度为 l o g 2 N log_2 N log2N
  • set中的元素不能被修改

set的使用

set<int> s; //默认升序
set<int , greater<int>>  us; //降序
int i;s.insert(i);  //插入值 若成功,则返回i所在迭代器,若失败,则返回已存在的i的迭代器s.erase(i);  //删除某个值 并 返回所删除的个数s.clear();  //清空ss.begin();  //begin迭代器s.end();  //end()迭代器s.find(i);  //查找i,若找到了,则返回i的迭代器,若没找到,返回尾部迭代器 s.end();s.empty();  //返回s是否为空s.size();  //返回s内元素个数

用例:

#include<iostream>
#include<set>using namespace std;int main()
{set<int> s;s.insert(1);s.insert(3);s.insert(2);s.insert(4);s.insert(5);s.insert(1);  //插入第二个1//这里用了范围for ,因为右迭代器,因此自动遍历for (auto& e : s){cout << e << " ";}cout << endl;   //遍历结果: 1 2 3 4 5//删除3再遍历  set会自动调整s.erase(3);for (auto& e : s){cout << e << " ";}cout << endl;   //遍历结果: 1 2 4 5//清理ss.clear();for (auto& e : s){cout << e << " ";}cout << endl; //空值set<int, greater<int>>  us; //降序set//插入:us.insert(1);us.insert(2);us.insert(3);us.insert(4);us.insert(5);//遍历for (auto& e : us){cout << e << " ";}cout << endl;  //遍历结果为降序: 5 4 3 2 1return 0;
}

在这里插入图片描述

关联式容器

之前学习的容器中,基本都是单元素存储,比如:vector、list、deque、等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。即 K 模型 的容器
关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高
例如上面的set也是关联式容器,set中只放value,但在底层实际存放的是由<value, value>构成的键值对

键值对

用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息.即 KV 模型 的容器
在这里插入图片描述

STL中键值对的定义:

template <class T1, class T2>
struct pair
{
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair(): first(T1()), second(T2())
{}
pair(const T1& a, const T2& b): first(a), second(b)
{}
};

map

什么是map

一种存储键值对,底层为二叉搜索树的数据结构

  • 需要包含头文件#include<map>
  • map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。即 KV 模型
  • 在map中,键值key通常用于排序和惟一地标识元素,而值value中存储与此键值key关联的内容。键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类型value_type绑定在一起,为其取别名称为pair:
    typedef pair<const key, T> value_type 其中,key为const,因此是不能修改的,而T是可以修改的
  • map中的元素按照键值key进行比较排序
  • map支持下标访问,即在[]中放入key,就可以找到与key对应的value。
  • map底层实际上就是二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))。

map的使用

先创建一个map对象:

map<string, string> m;

map的插入方式

几种常见的map插入方式:

    m.insert(make_pair("left", "左边"));m.insert(pair<string, string>("right", "右边"));m["insert"] = "插入";
  1. 因为map中存储的是键值对元素,因此每次插入的时候应该使用pair函数
    m.insert(pair<string, string>("right", "右边"));
    但是这种方法有点麻烦,因此引用了make_pair函数

  2. make_pair是一个仿函数,定义如下:
    返回值还是一个pair键值对:
    在这里插入图片描述
    因此当map插入值的时候可以使用以下方法:
    m.insert(make_pair("left", "左边"));
    这种方式是最常用的

  3. 因为map重载了[],因此可以直接使用[]来进行插入
    map中operator[]的原理是:

  • 用<key, T()>构造一个键值对,然后调用insert()函数将该键值对插入到map中
  • 如果key已经存在,插入失败,insert函数返回该key所在位置的迭代器
  • 如果key不存在,插入成功,insert函数返回新插入元素所在位置的迭代器
  • operator[]函数最后将insert返回值键值对中的value返回
    m["insert"] = "插入";
    其中,[]内为 K 值, 返回的V被 = 后的内容赋值;

常用功能

    m.insert(make_pair("erase", "删除"));  //插入值 若已存在,则返回该值的迭代器m.erase("erase");  //删除值m.clear();  //清除mapm.size();  //返回 K 元素的数量m.begin();  //begin迭代器m.end();  //end迭代器m.find("erase");  //查找 K 值,若找到了,则返回迭代器, 若没找到,则返回迭代器m.end()m["find"];  //插入K ,若有m.swap(m2);  //交换两个map对象 其中m2 为另一个与m对象同类型的对象

map[] 的灵活使用

map因为重载了[] ,因此变得非常灵活,例如,统计下列数组中相同的值出现的次数:

#include<iostream>
#include<string>
#include<map>using namespace std;int main()
{string arr[] = { "西瓜","西瓜", "西瓜", "西瓜","苹果","苹果","苹果","苹果","苹果","苹果","香蕉","香蕉","香蕉","香蕉","草莓","草莓","草莓","草莓","草莓","草莓","草莓", };map<string, int> m;for (auto& e : arr){m[e]++; //这里直接利用[]对m进行插入,并通过++ 对V值进行控制}for (auto& e : m){cout << e.first << ":" << e.second << endl;}return 0;
}

输出结果:
在这里插入图片描述

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

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

相关文章

掌握未来技术:一站式深度学习学习平台体验!

介绍&#xff1a;深度学习是机器学习的一个子领域&#xff0c;它模仿人脑的分析和学习能力&#xff0c;通过构建和训练多层神经网络来学习数据的内在规律和表示层次。 深度学习的核心在于能够自动学习数据中的高层次特征&#xff0c;而无需人工进行复杂的特征工程。这种方法在图…

大模型笔记:RAG(Retrieval Augmented Generation,检索增强生成)

1 大模型知识更新的困境 大模型的知识更新是很困难的&#xff0c;主要原因在于&#xff1a; 训练数据集固定,一旦训练完成就很难再通过继续训练来更新其知识参数量巨大,随时进行fine-tuning需要消耗大量的资源&#xff0c;并且需要相当长的时间LLM的知识是编码在数百亿个参数中…

一些C语言知识

C语言的内置类型&#xff1a; char short int long float double C99中引入了bool类型&#xff0c;用来表示真假的变量类型&#xff0c;包含true&#xff0c;false。 这个代码的执行结果是什么&#xff1f;好好想想哦&#xff0c;坑挺多的。 #include <stdio.h>int mai…

STM32(5) GPIO(2)输出

1.点亮LED 1.1 推挽接法和开漏接法 要想点亮LED&#xff0c;有两种接法 推挽接法&#xff1a; 向寄存器写1&#xff0c;引脚输出高电平&#xff0c;LED点亮&#xff1b;向寄存器写0&#xff0c;引脚输出低电平&#xff0c;LED熄灭。 开漏接法&#xff1a; 向寄存器写0&…

《精益DevOps》:填补IT服务交付的认知差距,实现高效可靠的客户期望满足

写在前面 在当今的商业环境中&#xff0c;IT服务交付已经成为企业成功的关键因素之一。然而&#xff0c;实现高效、可靠、安全且符合客户期望的IT服务交付却是一项艰巨的任务。这要求服务提供商不仅具备先进的技术能力&#xff0c;还需要拥有出色的组织协作、流程管理和态势感…

UniApp项目处理小程序分包

目前 uniApp也成为一种 App端开发的大趋势 因为在目前跨端 uniApp可以说相当优秀 可以同时兼容 H5 PC 小程序 APP 的技术 目前市场屈指可数 那么 说到微信小程序 自然就要处理分包 因为微信小程序对应用大小限制非常铭感 限制在2MB 超过之后就会无法真机调试与打包 不过需要注…

vue项目中使用antvX6新手教程,附demo案例讲解(可拖拽流程图、网络拓扑图)

前言&#xff1a; 之前分别做了vue2和vue3项目里的网络拓扑图功能&#xff0c;发现对antv X6的讲解博客比较少&#xff0c;最近终于得闲码一篇了&#xff01; 需求&#xff1a; 用户可以自己拖拽节点&#xff0c;节点之间可以随意连线&#xff0c;保存拓扑图数据后传给后端&…

cPanel面板安装付费的SSL证书

前不久遇到购买Hostease服务器的客户反馈需要安装SSL证书。因为安装 SSL 证书不仅可以保护用户数据安全&#xff0c;增加用户信任度&#xff0c;提升搜索引擎排名&#xff0c;还有助于符合法规和标准&#xff0c;防止网络攻击。 安装SSL证书可以通过如下步骤: 1. 选择 SSL 证书…

数学建模【多元线性回归模型】

一、多元线性回归模型简介 回归分析是数据分析中最基础也是最重要的分析工具&#xff0c;绝大多数的数据分析问题&#xff0c;都可以使用回归的思想来解决。回归分析的任务就是&#xff0c;通过研究自变量X和因变量Y的相关关系&#xff0c;尝试去解释Y的形成机制&#xff0c;进…

Linux配置网卡功能

提示:工具下载链接在文章最后 目录 一.network功能介绍二.配置network功能2.1 network_ip配置检查 2.2 network_br配置2.2.1 配置的网桥原先不存在检查2.2.2 配置的网桥已存在-修改网桥IP检查2.2.3 配置的网桥已存在-只添加网卡到网桥里检查 2.3 network_bond配置检查 2.4 netw…

Access AR Foundation 5.1 in Unity 2022

如果已经下载安装了ARF但版本是5.0.7 可以通过下面的方式修改 修改后面的数字会自动更新 更新完成后查看版本 官方文档 Access AR Foundation 5.1 in Unity 2021 | AR Foundation | 5.1.2

【知识整理】Git 使用实践问题整理

问题1、fatal: refusing to merge unrelated histories 一、Git 的报错 fatal: refusing to merge unrelated histories 新建了一个仓库之后&#xff0c;把本地仓库进行关联提交、拉取的时候&#xff0c;出现了如下错误&#xff1a; fatal: master does not appear to be a g…

电脑无法开启虚拟化

vm开启虚拟化失败 如果出现以下错误&#xff0c;需要进入bios界面&#xff0c;不同电脑进入界面的方式不一样。这里以hp为例&#xff1a; 1、关机后&#xff0c;按住开机键和f10&#xff0c;进入如下界面&#xff08;语言在主菜单里面&#xff09; 2、选择先进和下面的系统选…

c语言游戏实战(10):坤坤的篮球回避秀

前言&#xff1a; 这款简易版的球球大作战是博主耗时两天半完成的&#xff0c;玩家需要控制坤坤在游戏界面上移动&#xff0c;来躲避游戏界面上方不断掉下来的篮球。本游戏使用C语言和easyx图形库编写&#xff0c;旨在帮助初学者了解游戏开发的基本概念和技巧。 在开始编写代…

Vue使用高德地图定位到当前位置,并显示天气信息

首先得去高德控制台申请两个 key&#xff0c;一个天气key和一个定位key 获取天气信息的函数&#xff1a; const getWeather function (city) {// 使用 fetch 发送请求获取天气信息fetch(https://restapi.amap.com/v3/weather/weatherInfo?city${city}&keyeefd36557b0250…

哪个有名的工具可以安全记事 私密记事本笔记推荐

在这个数字化的时代&#xff0c;我们的生活已经离不开各种记事工具。它们帮助我们记录生活中的点点滴滴&#xff0c;无论是工作上的重要事项&#xff0c;还是个人的私密心情。然而&#xff0c;当我在寻找一个能够安心记录私密事情的工具时&#xff0c;安全性成为了我最关心的因…

【软件测试】Postman中变量的使用

Postman中可设置的变量类型有全局变量&#xff0c;环境变量&#xff0c;集合变量&#xff0c;数据变量及局部变量。区别则是各变量作用域不同&#xff0c;全局变量适用于所有集合&#xff0c;环境变量适用于当前所选环境&#xff08;所有集合中均可使用不同环境变量&#xff09…

【CSP试题回顾】202309-2-坐标变换(其二)

CSP-202309-2-坐标变换&#xff08;其二&#xff09; 关键点总结 1.输入输出的同步关闭&#xff0c;以加快I/O操作的速度 这一点还是很重要的&#xff0c;本题代码如果不进行输入输出的同步关闭会时间超限。 ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);2.…

K8S中POD的控制器

一、Pod控制器及其功用 Pod控制器&#xff0c;又称之为工作负载&#xff08;workload&#xff09;&#xff0c;是用于实现管理pod的中间层&#xff0c;确保pod资源符合预期的状态&#xff0c;pod的资源出现故障时&#xff0c;会尝试进行重启&#xff0c;当根据重启策略无效&am…

Linux基础命令[9]-wc

文章目录 1. wc 命令说明2. wc 命令语法3. wc 命令示例3.1 不加参数3.2 -c&#xff08;统计字节数&#xff09;3.3 -m&#xff08;统计字符数&#xff09;3.4 -l&#xff08;统计行数&#xff09;3.5 -L&#xff08;最长一行的长度&#xff09;3.6 -w&#xff08;统计单词数&am…