[C++]18:set和map的使用

set和map的使用

  • 一.关联式容器:
    • 1.简单概念:
    • 2.<key , value>--->键值对
    • 3.set和map的底层结构(平衡搜索树或者红黑树)
  • 二.set
    • 1.set (排序+不重复)
      • 1.模板参数:
      • 2.set是一个有序存储的容器:
      • 3.set中每个数据有且只有一个:
      • 4.set底层的特殊结构:
      • 5.find和erase的使用:
      • 6.count返回数值个数:
    • 2.multiset(排序+允许重复)
      • 1.set和multiset区别:
      • 2.count的用武之地:
  • 三.map
    • 1.map(排序+不重复)
      • 1.简单概念:
      • 2.插入数据和多种初始化方式:
      • 3.查找和删除:
      • 4.count计数:
      • 5.不允许重复key值插入:
      • 6.数据统计:
      • 7.operator[]的重载:(数据统计优化)
    • 2.multimap(排序+允许重复)
      • 1.map和mulitmap区别:
      • 2.count的用武之地:
      • 3.总结:multimap和map唯一不同的是:map中的key是唯一的,而multimap中的key值是可以重复的。

一.关联式容器:

1.简单概念:

1,map 和 set 是一个关联式容器,比较vector,queue , stack ,序列式的容器来说。关联式容器的结构对于数据的检索是更加方便的。
2.map和set是一种<key , value>的结构。

2.<key , value>—>键值对

SGI_STL中的键值对
通过类的模板参数实现不同类型数据的一一对应:

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

3.set和map的底层结构(平衡搜索树或者红黑树)

1.在特殊情况下我们的搜索二叉树会变成一个单枝的情况。
2.搜索的时间复杂度就大大降低,从高度到个数的复杂度变化。
3.平衡搜索树或者红黑树会在相同可能产生单枝的情况下进行数据的平衡调整,从而保证树的平衡性。

在这里插入图片描述

二.set

1.set (排序+不重复)

1.模板参数:

在这里插入图片描述

2.set是一个有序存储的容器:

1.insert进行数据的插入。
2.使用迭代器遍历数据。
3.set默认的比较方式是一个升序。
4.set中的数据是不可以随便进行修改的需要保证有序

在这里插入图片描述

3.set中每个数据有且只有一个:

1.相同的数据不能存贮多个在set中。
2.set中每个数据有且只有一个。

在这里插入图片描述

4.set底层的特殊结构:

1.set中不存在<< key value>>的结构—>实际底层是 << value value>> 的结构
2.set在插入数据的时候其实对底层的pair的两个value都插入数据但是在上层我们只需要去插入一个数据,不需要考虑pair的存在。

5.find和erase的使用:

在这里插入图片描述
在这里插入图片描述

情况一
1,传数据的值,返回相同数据的迭代器,如果数据的不存在返回最后一个数值迭代器的下一个。
2.erase的重载一进行配合使用:
3.缺点:删除的数据一定存在否则一定报错。

删除数据存在的情况:
在这里插入图片描述
删除的数据不存在的情况:
在这里插入图片描述

情况二:
1.可以直接对erase传需要删除的数据的值。
2.情况一:存在就删除。
3.情况二:不存在就不删除,不会产生越界的问题。

情况一:存在就删除。
在这里插入图片描述

情况二:不存在就不删除,不会产生越界的问题

在这里插入图片描述

情况三:范围删除

1set的erase的范围删除是需要满足左闭右开的一个范围删除。
2.find的使用就不能非常好的满足条件?
3.find查找数据的依据是传参的数值是否在set中存在!
4.显然find的查找范围就非常的不靠谱,set中提供了两个方法。
5.lower_bound 和 upper_bound
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

6.count返回数值个数:

1,因为set要求(排序+不重复)特殊结构 ,count只有两个数值0或者1

2.multiset(排序+允许重复)

1.set和multiset区别:

1.允许key值的冗余。
2.数据的插入比较随意但是考虑平衡性。
3.find的查找存在多个返回中序的第一个相同数据的迭代器。

4.multiset中的数据是不可以随便进行修改的需要保证有序

在这里插入图片描述

2.count的用武之地:

1.统计重复的数据的个数:

在这里插入图片描述

三.map

1.map(排序+不重复)

在这里插入图片描述

1.简单概念:

1.map是一个关联性容器底层存储一个pair类。
2.对于pair来说==< key value>== 两个对象的类型可能是不相同的。

2.插入数据和多种初始化方式:

1.构建对象然后传参
2.使用make_pair
3.多参数构造函数提供的隐式类型转换。

在这里插入图片描述

3.查找和删除:

在这里插入图片描述

1.An iterator to the element, if an element with specified key is found, or map::end otherwise.—传数据的值,返回相同数据的迭代器,如果数据的不存在返回最后一个数值迭代器的下一个。

在这里插入图片描述

1.这些内容和set中都是一样的,但是注意每次都是通过key值去进行考虑的,value值是不参与的。

在这里插入图片描述

4.count计数:

1.不允许重复key数据的出现所以count在map中同样也i是0或者1.

5.不允许重复key值插入:

进行测试:
在这里插入图片描述

6.数据统计:

方法一:find+insert:
在这里插入图片描述

void text_5_4()
{map<string, int> m1;const char* str[] = { "葡萄","西瓜","苹果","香蕉","草莓","葡萄","西瓜","西瓜","苹果","香蕉","草莓" "葡萄","西瓜","苹果","香蕉","草莓","草莓","西瓜","西瓜","葡萄","葡萄","香蕉","香蕉","苹果" };//1.简单的数据统计:for (int i = 0; i < sizeof(str) / sizeof(str[0]); i++){auto tmp = m1.find(str[i]);//1.第一次插入:if (tmp == m1.end()){m1.insert(make_pair(str[i], 1));}//2.不是第一次插入:else{((*tmp).second)++;}}map<string, int>::iterator it = m1.begin();while (it != m1.end()){cout << (*it).first << ":" << (*it).second << endl;it++;}cout << endl;
}

在这里插入图片描述

方法二:insert返回值pair类型:
在这里插入图片描述

void text_5_5()
{map<string, int> m1;const char* str[] = { "葡萄","西瓜","苹果","香蕉","草莓","葡萄","西瓜","西瓜","苹果","香蕉","草莓" "葡萄","西瓜","苹果","香蕉","草莓","草莓","西瓜","西瓜","葡萄","葡萄","香蕉","香蕉","苹果" };//1.简单的数据统计:for (int i = 0; i < sizeof(str) / sizeof(str[0]); i++){//1.bool 为true说明当前插入值不存在:pair<map<string, int>::iterator,bool> ret = m1.insert(make_pair(str[i], 1));//2.bool 为false说明当前插入值已经存在:if (!ret.second){((*(ret.first)).second)++;}}map<string, int>::iterator it = m1.begin();while (it != m1.end()){cout << (*it).first << ":" << (*it).second << endl;it++;}cout << endl;
}

在这里插入图片描述

7.operator[]的重载:(数据统计优化)

在这里插入图片描述

void text_5_6()
{map<string, int> m1;const char* str[] = { "葡萄","西瓜","苹果","香蕉","草莓","葡萄","西瓜","西瓜","苹果","香蕉","草莓" "葡萄","西瓜","苹果","香蕉","草莓","草莓","西瓜","西瓜","葡萄","葡萄","香蕉","香蕉","苹果" };//1.简单的数据统计:for (int i = 0; i < sizeof(str) / sizeof(str[0]); i++){m1[str[i]]++;}map<string, int>::iterator it = m1.begin();while (it != m1.end()){cout << (*it).first << ":" << (*it).second << endl;it++;}cout << endl;
}

在这里插入图片描述

2.multimap(排序+允许重复)

1.map和mulitmap区别:

1.multimap不适合用于数据统计可以存放相同类型的key值。

在这里插入图片描述

2.count的用武之地:

在这里插入图片描述

3.总结:multimap和map唯一不同的是:map中的key是唯一的,而multimap中的key值是可以重复的。

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

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

相关文章

Vi/Vim 使用小窍门,如何消除搜索后的关键字高亮

Vim/Vi 基本上是 *nix 世界最受欢迎的编辑器了&#xff0c;不知道为什么&#xff0c;一直以来觉得和 Emacs 比起来&#xff0c;Vim 更加有亲和力。用起来很舒服。 今天就记录一个困扰了我很久的问题。 大家应该都知道&#xff0c;在 Vi 里面如果要搜索某个关键字&#xff0c;…

ChatGPT调教指南 | 咒语指南 | Prompts提示词教程(三)

在人工智能成为我们日常互动中无处不在的一部分的时代&#xff0c;与大型语言模型(llm)有效沟通的能力是无价的。“良好提示的26条原则”为优化与这些复杂系统的交互提供了全面的指导。本指南证明了人类和人工智能之间的微妙关系&#xff0c;强调清晰、专一和结构化的沟通方法。…

vscode输入英文时字体之间的间隔突然变大,似中文

vscode输入英文时字体之间的间隔突然变大&#xff0c;似中文 主要原因&#xff1a; 是由于输入法变成全角模式了。原因可能是不小心按了 shift空格键快捷键造成的。 正常情况&#xff0c;全角就是字母和数字等与汉字占等宽位置的字。 半角就是ASCII方式的字符&#xff0c;在没…

Sora:视频生成模型作为世界模拟器

我们探索了视频数据上生成模型的大规模训练。具体来说&#xff0c;我们在可变持续时间、分辨率和长宽比的视频和图像上联合训练文本条件扩散模型。我们利用了一个在视频和图像潜在码的时空块上操作的变压器架构。我们规模最大的模型 Sora 能够生成一分钟的高保真视频。我们的结…

第十四章 Linux面试题

第十四章 Linux面试题 日志t.log(访问量)&#xff0c; 将各个ip地址截取&#xff0c;并统计出现次数&#xff0c;并按从大到小排序(腾 讯) http://192. 168200.10/index1.html http://192. 168.200. 10/index2.html http:/192. 168 200.20/index1 html http://192. 168 200.30/…

c++学习记录 STL初识—vector存放内置数据类型

#include<iostream> using namespace std; #include<vector> #include<algorithm>//标准算法头文件//容器&#xff1a;vector //算法&#xff1a;for_each //迭代器&#xff1a;vector<int>::iteratorvoid myPrint(int val) {cout << val <&l…

微服务篇之分布式系统理论

一、CAP定理 1.什么是CAP 1998年&#xff0c;加州大学的计算机科学家 Eric Brewer 提出&#xff0c;分布式系统有三个指标&#xff1a; 1. Consistency&#xff08;一致性&#xff09;。 2. Availability&#xff08;可用性&#xff09;。 3. Partition tolerance &#xff0…

力扣 187. 重复的DNA序列

1.题目 DNA序列 由一系列核苷酸组成&#xff0c;缩写为 A, C, G 和 T.。 例如&#xff0c;"ACGAATTCCG" 是一个 DNA序列 。 在研究 DNA 时&#xff0c;识别 DNA 中的重复序列非常有用。 给定一个表示 DNA序列 的字符串 s &#xff0c;返回所有在 DNA 分子中出现不止一…

医院LIS(全称Laboratory Information Management System)系统源码

目录 一、医院LIS系统概况 二、医院LIS系统建设必要性 三、为什么要使用LIS系统 四、技术框架 &#xff08;1&#xff09;总体框架 &#xff08;2&#xff09;技术细节 &#xff08;3&#xff09;LIS主要功能模块 五、LIS系统优势 &#xff08;1&#xff09;客户/用户…

JAVA工程师面试专题-《Mysql》篇

目录 一、基础 1、mysql可以使用多少列创建索引&#xff1f; 2、mysql常用的存储引擎有哪些 3、MySQL 存储引擎&#xff0c;两者区别 4、mysql默认的隔离级别 5、数据库三范式 6、drop、delete 与 truncate 区别&#xff1f; 7、IN与EXISTS的区别 二、索引 1、索引及索…

构建SatelliteRpc:基于Kestrel的RPC框架(整体设计篇)

背景 之前在.NET 性能优化群内交流时&#xff0c;我们发现很多朋友对于高性能网络框架有需求&#xff0c;需要创建自己的消息服务器、游戏服务器或者物联网网关。但是大多数小伙伴只知道 DotNetty&#xff0c;虽然 DotNetty 是一个非常优秀的网络框架&#xff0c;广泛应用于各种…

二叉树高频题目(不含树形DP)

二叉树高频题 二叉树的层序遍历 . - 力扣&#xff08;LeetCode&#xff09; 按点弹出 class Solution { public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>>ans;if(root!nullptr){queue<TreeNode*>q;unordered_map&…

遥感、航拍、影像等用于深度学习的数据集集合

遥感图像的纹理特征异常繁杂&#xff0c;地貌类型多变&#xff0c;人工提取往往存在特征提取困难和特征提取不准确的问题&#xff0c;同时&#xff0c;在这个过程中还会耗费海量的人力物力。随着计算力的突破、数据洪流的暴发和算法的不断创新&#xff0c;在具有鲜明“大数据”…

SpringBoot:自定义starter

点击查看&#xff1a;LearnSpringBoot08starter 点击查看&#xff1a;LearnSpringBoot08starterTest 点击查看更多的SpringBoot教程 一、主要流程 1. 先创建空的project 2. 打开空的project 结构 图选中model 点击 3. 创建 model&#xff08;Maven&#xff09;启动器 提…

Microsoft的PromptBench可以做啥?

目录 PromptBench简介 PromptBench的快速模型性能评估 PromptBench数据集介绍 PromptBench模型介绍 PromptBench模型加载遇到的问题 第一次在M1 Mac上加载模型 vicuna和llama系列模型 PromptBench各个模型加载情况总结 PromptBench的Prompt快速工程 chain of thought…

C++——二叉搜索树

二叉搜索树 二叉搜索树&#xff1a; 又为搜索二叉树&#xff0c;一般具有以下的性质 若它的左子树不为空&#xff0c;则左子树上所有的节点的值都小于父亲节点若它的右子树不为空&#xff0c;则右子树上所有的节点的值都大于父亲节点它的左右子树也都为二叉搜索树 二叉搜索树…

设计模式六:策略模式

1、策略模式 策略模式定义了一系列的算法&#xff0c;并将每一个算法封装起来&#xff0c;使每个算法可以相互替代&#xff0c;使算法本身和使用算法的客户端分割开来&#xff0c;相互独立。 策略模式的角色&#xff1a; 策略接口角色IStrategy&#xff1a;用来约束一系列具体…

基于SpringBoot的航班进出港管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

使用GPT生成python图表

首先&#xff0c;生成一脚本&#xff0c;读取到所需的excel表格 import xlrddata xlrd.open_workbook(xxxx.xls) # 打开xls文件 table data.sheet_by_index(0) # 通过索引获取表格# 初始化奖项字典 awards_dict {"一等奖": 0,"二等奖": 0,"三等…

消息中间件篇之Kafka-高性能设计

一、高性能设计 消息分区&#xff1a;不受单台服务器的限制&#xff0c;可以不受限的处理更多的数据。 顺序读写&#xff1a;磁盘顺序读写&#xff0c;提升读写效率。 页缓存&#xff1a;把磁盘中的数据缓存到内存中&#xff0c;把对磁盘的访问变为对内存的访问。 零拷贝&a…