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.rhkb.cn/news/268732.html

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

相关文章

Docker之数据卷自定义镜像

文章目录 前言一、数据卷二、自定义镜像 前言 Docker提供了一个持久化存储数据的机制&#xff0c;与容器生命周期分离&#xff0c;从而带来一系列好处&#xff1a; 总的来说Docker 数据卷提供了一种灵活、持久、可共享的存储机制&#xff0c;使得容器化应用在数据管理方面更加…

Newtonsoft.Json

目录 引言 1、简单使用 1.1、官方案例 1.2、JsonConvert 2、特性 2.1、默认模式[JsonObject(MemberSerialization.OptIn/OptOut)] 2.2、序列化为集合JsonArrayAttribute/JsonDictionaryAttribute 2.3、序列化该元素JsonProperty 2.4、忽略元素JsonIgnoreAttribute 2.5、…

超全Chat GPT论文修改指令

文献综述指令润色修改指令论文选题指令论文大指令研究理论指令论文致谢指令参考文献指令论文润色整体逻辑论文整体优化提问指令 1&#xff0e;文献综述指令 请你帮我写一份关于&#xff08;研究主题&#xff09;的文献综述。我的论文选题方向是 XXXX &#xff0c;我已经找到了…

WordPress上传图片错误:不是合法的JSON响应

最近在进行WordPress迁移至新服务器的过程中&#xff0c;遭遇到一个棘手的问题&#xff0c;即在编辑文章并上传图片时&#xff0c;不断遭遇“此响应不是合法的JSON响应”的错误。经过多次验证和搜索&#xff0c;最终确定问题的根本原因并不在于禁用 Gutenberg 编辑器或安装经典…

uniapp从入门到精通(全网保姆式教程)~ 别再说你不会开发小程序了

目录 一、介绍 二、环境搭建&#xff08;hello world&#xff09; 2.1 下载HBuilderX 2.2 下载微信开发者工具 2.3 创建uniapp项目 2.4 在浏览器运行 2.5 在微信开发者工具运行 2.6 在手机上运行 三、项目基本目录结构 四、开发规范概述 五、全局配置文件&#xff0…

如何在Node.js中使用定时器

在Node.js中使用定时器是一项常见且重要的任务&#xff0c;特别是在需要执行定时任务或者轮询操作的情况下。Node.js提供了多种方式来实现定时器功能&#xff0c;包括setTimeout、setInterval和setImmediate等方法。本篇博客将介绍如何在Node.js中使用这些定时器&#xff0c;并…

Kubernetes的Sevice管理

服务原理: 所有服务都是根据这个服务衍生或者变化出来,根服务---- 服务感知后端靠标签 slelector 标签选择器 kubectl label pods web1 appweb kubectl cluter-info dump | grep -i service-cluster-ip-range 服务ip取值范围 Service 管理: 创建服务: --- kind: Serv…

python复盘(1)

1、变量名的命名规则 #3、变量名的命名规则&#xff1a;可以用中文作为变量名&#xff1b;其他和go语言一样 # 变量名可以用数字、字母、下划线组成&#xff0c;但是数字不能作为开头 # 变量名不能使用空格&#xff0c;不能使用函数名或关键字 # 变量名最好能表示出他的作用2、…

大模型(LLM)的量化技术Quantization原理学习

在自然语言处理领域&#xff0c;大型语言模型&#xff08;LLM&#xff09;在自然语言处理领域的应用越来越广泛。然而&#xff0c;随着模型规模的增大&#xff0c;计算和存储资源的需求也急剧增加。为了降低计算和存储开销&#xff0c;同时保持模型的性能&#xff0c;LLM大模型…

OpenGL 实现色温、色调、亮度、对比度、饱和度、高光

1.简介 色温&#xff1a;简单理解是色彩的温度&#xff0c;越低越冷如蓝色&#xff0c;约高越暖如红色。 亮度&#xff1a;增加就是给图片所有色彩加白色&#xff0c;减少加黑色。注意是只加黑白两种颜色&#xff0c;不然容易跟纯度弄混。 对比度&#xff1a;增加就是让白的…

2023人机交互期末复习

考试题型及分值分布 1、选择题&#xff08;10题、20分&#xff09; 2、填空题&#xff08;10题、20分&#xff09; 3、判断题&#xff08;可选、5题、10分&#xff09; 4、解答题&#xff08;5~6题、30分&#xff09; 5、分析计算题&#xff08;1~2题、20分&#xff09; 注意&…

如何做代币分析:以 LEO 币为例

作者&#xff1a; lesleyfootprint.network 编译&#xff1a;cicifootprint.network 数据源&#xff1a;LEO 代币仪表板 &#xff08;仅包括以太坊数据&#xff09; 在加密货币和数字资产领域&#xff0c;代币分析起着至关重要的作用。代币分析指的是深入研究与代币相关的数…

uniapp实战:父子组件传参之子组件数量动态变化

需求说明 现有的设置单元列表,每个带有虚线加号的可以看做是一组设置单元,点击加号可以添加一组设置单元.点击设置单元右上角可以删除对应的设置单元. 实现思路说明 利用数组元素添加或是删除的方式实现页面数量动态变化.由于每个设置单元内容都相同所以单独封装了一个子组件.…

LeetCode206题:反转链表(python3)

采用递归 class Solution:def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:cur headpre Nonewhile cur:temp cur.next # 保存下一轮循环的节点cur.next pre # 将当前节点 cur 的指针指向上一个节点 prepre curcur tempreturn pre

uni-app 微信小程序:启用组件按需注入

原文地址&#xff1a;uni-app 微信小程序&#xff1a;启用组件按需注入 - 掘金 只需添加以下代码"lazyCodeLoading": "requiredComponents"

卷积神经网络(CNN)原理与实现

卷积神经网络(CNN) 卷积神经网络原理卷积神经网络的数学推导卷积层反向传播算法数学推导卷积层实现代码 卷积神经网络(CNN) 卷积神经网络原理 卷积神经网络是一种用于图像、语音、自然语言等数据的深度学习模型&#xff0c;其核心思想是使用卷积操作提取输入数据的特征&…

Mysql中的事务

什么是事务&#xff1a; 多条sql语句&#xff0c;要么全部成功&#xff0c;要么全部失败。 事务的特性&#xff1a; 1&#xff1a;原子性(Atomic)&#xff1a; 组成一个事务的多个数据库操作是一个不可分割的原子单元&#xff0c;只有所有操作都成功&#xff0c;整个事务才会…

算法学习系列(三十八):超级源点问题

目录 引言一、题目描述二、解题思路三、示例代码 引言 关于最短路问题不论是竞赛、找工作、笔试面试、机试考的都是挺多的&#xff0c;所以还是非常的重要&#xff0c;最重要的就是模板首先背过&#xff0c;然后通过刷题见各种各样的题&#xff0c;具体难点就是如何建图、怎么…

【牛客面试必刷TOP101】Day25.BM38 在二叉树中找到两个节点的最近公共祖先和BM40 重建二叉树

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;牛客面试必刷TOP101 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&…

什么是智能合约

前言&#xff1a;在介绍智能合约的前提下&#xff0c;需要先介绍一下区块链 一.什么是区块链 区块链实质上是一个去中心化、分布式的可进行交易的数据库或账本&#xff0c;具有下列典型特征&#xff1a; 去中心化&#xff1a;简单来说&#xff0c;在网络上一个或多个服务器瘫…