前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C++精通之路:map和set的介绍和有关oj题

C++精通之路:map和set的介绍和有关oj题

作者头像
雪芙花
发布于 2022-10-31 10:19:19
发布于 2022-10-31 10:19:19
38800
代码可运行
举报
文章被收录于专栏:雪芙花雪芙花
运行总次数:0
代码可运行

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情

一:关联式容器

序列式容器: 初阶阶段中学习过STL中的部分容器,如:vector、list、deque等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身

关联式容器: 关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对(保存映射关系),在数据检索时比序列式容器效率更高

二:键值对

  • 概念: 用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息
  • SGI-STL中关于键值对的定义:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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&amp; a, const T2&amp; b): first(a), second(b)
{}
};

三:set

1. set的介绍

  1. set是按照一定次序存储元素的容器
  2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素 不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。
  3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。
  4. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直 接迭代。
  5. set在底层是用二叉搜索树(红黑树)实现的

2. set的使用

set的模板参数列表:

T: set中存放元素的类型,实际在底层存储<value, value>的键值对。 Compare:set中元素默认按照小于来比较 Alloc:set中元素空间的管理方式,使用STL提供的空间配置器管理

3. set的使用举例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <set>
void TestSet()
{
// 用数组array中的元素构造set
int array[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0, 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
set<int> s(array, array+sizeof(array)/sizeof(array));
cout << s.size() << endl;
// 正向打印set中的元素,从打印结果中可以看出:set可去重
for (auto&amp; e : s)
cout << e << " ";
cout << endl;
// 使用迭代器逆向打印set中的元素
for (auto it = s.rbegin(); it != s.rend(); ++it)
cout << *it << " ";
cout << endl;
// set中值为3的元素出现了几次
cout << s.count(3) << endl;
}
  • C++中的multiset
  1. multiset容器与set容器实现和接口基本一致,唯一区别就是,multiset允许键值冗余,即multiset容器当中存储的元素是可以重复的
  2. 注意:对于find来说multiset返回底层搜索树中序的第一个键值为key的元素的迭代器

四: map

一:map的介绍

  1. map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。
  2. 在map中,键值key通常用于排序和惟一地标识元素,而值value中存储与此键值key关联的内容。键值 key和值value的类型可能不同,并且在map的内部,key与value通过成员类型value_type绑定在一起, 为其取别名称为pair: typedef pair value_type;
  3. 在内部,map中的元素总是按照键值key进行比较排序的。
  4. map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序对元素进行 直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列)。
  5. map支持下标访问符,即在[]中放入key,就可以找到与key对应的value。
  6. map通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))二:map的使用
  • map的模板参数说明:

key: 键值对中key的类型 T: 键值对中value的类型 Compare: 比较器的类型,map中的元素是按照key来比较的,缺省情况下按照小于来比较,一般情况 下(内置类型元素)该参数不需要传递,如果无法比较时(自定义类型),需要用户自己显式传递比较规则 (一般情况下按照函数指针或者仿函数来传递) Alloc:通过空间配置器来申请底层空间,不需要用户传递,除非用户不想使用标准库提供的空间配置器 注意:在使用map时,需要包含头文件。

三:总结

  1. map中的的元素是键值对
  2. map中的key是唯一的,并且不能修改
  3. 默认按照小于的方式对key进行比较
  4. map中的元素如果用迭代器去遍历,可以得到一个有序的序列
  5. map的底层为平衡搜索树(红黑树),查找效率比较高
  6. 支持[]操作符,operator[]中实际进行插入查找。四:multimap multimap容器与map容器的底层实现以及成员函数的接口都是基本一致,区别是multimap允许键值冗余,即multimap容器当中存储的元素是可以重复的
  • 注意: 对于find来说multimap返回底层搜索树中序的第一个键值为key的元素的迭代器 由于multimap容器允许键值冗余,调用[ 运算符重载函数时,应该返回键值为key的哪一个元素的value的引用存在歧义,因此在multimap容器当中没有实现[ ]运算符重载函数

五:有关oj题

  • 代码:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    vector<string> topKFrequent(vector<string>&amp; words, int k) {
          //sort不稳定,堆排序也一样
          //用两个map来排序
          map<string,int> countMap;
          for(auto&amp; e: words)
          {
              countMap[e]++;
          }

          multimap<int,string,greater<int>> Map; //必须要用multimap,不然出现次数相同的string会被抵消掉
          for(auto&amp; e:countMap )
          {
              Map.insert(make_pair(e.second,e.first));
          }
          auto it = Map.begin();
          vector<string> v;
          while(k--)
          {
               v.push_back(it->second);
               it++;
          }
          return v;
    }
};
  • 思路:
  1. 用一个map按字典序排字符串,并且记录出现次数
  2. 再用一个multimap来排序出现次数,并且记录字符串
  3. 利用迭代器来输出前k大的数
  • 注意:
  1. 不能使用sort和堆来排序,因为不稳定
  2. 注意第二个map必须要用multimap,不然出现次数相同的string会被抵消掉
  3. multimap<int,string,greater> Map; ,注意是greater

总结:

  1. 当你只需要查找信息是否存在时,用set。
  2. 当你需要利用当前信息去查看与之关联的信息时,用map
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ClickHouse 源码解析(三):SQL 的一生(下)
基于 ClickHouse version 22.10.1 学习并写下 ClickHouse 源码解析系列。由于 CK 版本迭代很快,可能导致代码可能有些出入,但是整体流程大差不差吧。由于源码阅读过于枯燥,并且不太利于后续复习,所以在逻辑梳理时,我会使用思维导图或者流程图的方式来描述类与类之间的调用逻辑,后半部分会挑出核心的源码去分析。
用户8447023
2022/12/19
1.5K1
ClickHouse 源码解析(一):SQL 的一生(上)
基于 ClickHouse version 22.10.1 学习并写下 ClickHouse 源码解析系列。由于 CK 版本迭代很快,可能导致代码可能有些出入,但是整体流程大差不差吧。由于源码阅读过于枯燥,并且不太利于后续复习,所以在逻辑梳理时,我会使用思维导图或者流程图的方式来描述类与类之间的调用逻辑,后半部分会挑出核心的源码去分析。
用户8447023
2022/10/28
1.9K0
ClickHouse和他的朋友们(4)Pipeline处理器和调度器
原文出处:https://bohutang.me/2020/06/11/clickhouse-and-friends-processor/
老叶茶馆
2020/11/03
1.8K0
ClickHouse和他的朋友们(4)Pipeline处理器和调度器
[源码解析] Pytorch 如何实现后向传播 (3)---- 引擎动态逻辑
前文我们提到了 autograd 引擎的静态架构,本文开始我们从动态角度看看引擎是如何运作的。
罗西的思考
2021/11/02
1.4K0
tensorflow源码解析之common_runtime-executor-下
在执行器的执行图计算的时候,需要一个结构来保存当前计算的即时信息,TF为此设计了类ExecutorState,它被用来保存每一个对ExecutorImpl::Run调用的状态信息。它会在一个节点已经准备好之后调度这个节点,并且保存每个节点尚未完成的输入信息。 下面让我们先来看一下这个类的结构:
用户3128582
2018/09/02
9810
ClickHouse opt 2 QueryPlan::buildQueryPipeline
参考https://bbs.huaweicloud.com/blogs/314808
jasong
2023/11/05
4711
线程池管理的pipeline设计模式(用了“精进C++”里的内容)
2,增加了callback,将最后一个node的结果callback到主程序,避免的参数传递的冗余实现;
用户9831583
2022/12/04
1.3K0
Tensorflow源码解析3 — TensorFlow核心对象 – Graph
计算图Graph是TensorFlow的核心对象,TensorFlow的运行流程基本都是围绕它进行的。包括图的构建、传递、剪枝、按worker分裂、按设备二次分裂、执行、注销等。因此理解计算图Graph对掌握TensorFlow运行尤为关键。
全栈程序员站长
2021/07/06
4390
filebeat源码解析
在基于elk的日志系统中,filebeat几乎是其中必不可少的一个组件,例外是使用性能较差的logstash file input插件或自己造个功能类似的轮子:)。
franyang
2018/12/04
10.4K0
filebeat源码解析
[源码解析] Pytorch 如何实现后向传播 (2)---- 引擎静态结构
结合Engine定义,我们可以一一把这些输入与 execute 的参数对应起来。
罗西的思考
2021/10/29
8770
[源码解析] Pytorch 如何实现后向传播 (2)---- 引擎静态结构
[源码解析] Pytorch 如何实现后向传播 (2)---- 引擎静态结构
Engine 是autograd的核心,其实现了后向传播。后向传播方向是从根节点(就是正向传播的输出)到输出(就是正向传播的输入),在后向传播过程之中依据前向传播过程中设置的依赖关系生成了动态计算图。
冬夜先生
2021/10/28
6880
[源码解析] TensorFlow 分布式环境(6) --- Master 动态逻辑
在具体介绍 TensorFlow 分布式的各种 Strategy 之前,我们首先需要看看分布式的基础:分布式环境。只有把基础打扎实了,才能在以后的分析工作之中最大程度的扫清障碍,事半功倍。本文会从 Client 开始,看看 Master 如何对计算图进行处理。
罗西的思考
2022/05/09
6440
[源码解析] TensorFlow 分布式环境(6) --- Master 动态逻辑
读 NebulaGraph源码 | 查询语句 LOOKUP 的一生
LOOKUP 是图数据库 NebulaGraph 的一个查询语句。它依赖索引,可以查询点或者边的信息。在本文,我将着重从源码的角度解析一下 LOOKUP 语句的一生是如何度过的。
NebulaGraph
2023/01/05
1.5K0
读 NebulaGraph源码 | 查询语句 LOOKUP 的一生
网络流--最大流--POJ 1459 Power Network
A power network consists of nodes (power stations, consumers and dispatchers) connected by power transport lines. A node u may be supplied with an amount s(u) >= 0 of power, may produce an amount 0 <= p(u) <= pmax(u) of power, may consume an amount 0 <= c(u) <= min(s(u),cmax(u)) of power, and may deliver an amount d(u)=s(u)+p(u)-c(u) of power. The following restrictions apply: c(u)=0 for any power station, p(u)=0 for any consumer, and p(u)=c(u)=0 for any dispatcher. There is at most one power transport line (u,v) from a node u to a node v in the net; it transports an amount 0 <= l(u,v) <= lmax(u,v) of power delivered by u to v. Let Con=Σuc(u) be the power consumed in the net. The problem is to compute the maximum value of Con.
风骨散人Chiam
2020/10/28
3370
网络流--最大流--POJ 1459 Power Network
LeetCode 题解:785. Is Graph Bipartite?
Given an undirected graph, return true if and only if it is bipartite.
用户7886150
2021/02/08
3530
操作系统进程调度实验报告心得_进程的管理和控制实验报告
四、实验要求 1. 产生的各种随机数的取值范围加以限制,如所需的CPU时间限制在1~20之间。 2. 进程数n不要太大通常取4~8个 3. 使用动态数据结构 4. 独立编程 5. 两种调度算法
全栈程序员站长
2022/11/10
5.9K0
操作系统进程调度实验报告心得_进程的管理和控制实验报告
[源码解析]PyTorch如何实现前向传播(2) --- 基础类(下)
本系列将通过大概十篇左右文章来分析 PyTorch 的自动微分功能如何实现。本文是前向传播的第二篇,介绍自动微分(梯度计算)所涉及的部分 PyTorch 基础类。因为字数太多(1万两千字),所以拆分成上下两篇。
罗西的思考
2021/10/21
1.2K0
TensorFlow架构与设计:图模块
作者:刘光聪 ,中兴通讯高级系统架构师,专注机器学习算法,分布式系统架构与优化。 原文:TensorFlow架构与设计:图模块 (http://www.jianshu.com/p/a6d18c144052) 责编:王艺 CSDN AI记者,投稿、寻求报道、深入交流请邮件wangyi@csdn.net或扫描文末二维码添加微信。 相关文章:图解TensorFlow架构与设计 计算图是TensorFlow领域模型的核心。本文通过对计算图领域模型的梳理,讲述计算图构造的基本原理。 边 Edge持有前驱节
用户1737318
2018/06/06
1.1K0
ClickHouse和他的朋友们(2)MySQL Protocol和Read调用栈
原文出处:https://bohutang.me/2020/06/07/clickhouse-and-friends-mysql-protocol-read-stack/
老叶茶馆
2020/10/22
7190
[源码解析] Pytorch 如何实现后向传播 (1)---- 调用引擎
本系列将通过大概十篇左右文章来分析 PyTorch 的自动微分功能如何实现。本文是后向传播的第一篇,介绍调用流程:如何从 Python 代码进入到 C++ autograd 引擎。
罗西的思考
2021/10/29
1.6K0
[源码解析] Pytorch 如何实现后向传播 (1)---- 调用引擎
推荐阅读
相关推荐
ClickHouse 源码解析(三):SQL 的一生(下)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档