Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——13.map&&set
关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的 键值对, 在数据检索时比序列式容器效率更高。
hope kc
2024/09/23
760
移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——13.map&&set
【C++的剃刀】我不允许你还不会map和set
7. set中的元素不允许修改(为什么?) 8. set中的底层使用二叉搜索树(红黑树)来实现
小文要打代码
2024/10/16
850
【C++的剃刀】我不允许你还不会map和set
map和set的使用
在学习关联式容器之前,我们学习过的容器有vector、list、deque…这些容器称为序列式容器,单纯的存储数据存储的数据没有关联性。
南桥
2024/08/13
920
map和set的使用
介绍set和map容器
在初始阶段我们所学的STL容器当中,像vector,list,stack,queue等都是序列式容器,因为在其底层为线性序列的数据结构,里面储存的元素本身。那么什么是关联式容器呢? 关联式容器也是用来存储数据的,与序列式式容器不同的是,其里面存储的是<key,value>结构的键值对,在数据检索时比序列式容器效率更高
Yui_
2024/10/15
1000
介绍set和map容器
C++: set与map容器的介绍与使用
二叉树我们在c语言数据结构阶段已经学习过, 这里map和set的特性需要先铺垫二叉搜索树, 而二叉搜索树也是一种树形解构, 二叉搜索树的特性了解, 有助于更好的理解map和set的特性, 本文将借助二叉搜索树, 对二叉树部分进行收尾与总结.
用户11317877
2024/10/16
860
C++: set与map容器的介绍与使用
C++之map和set
本文介绍了C++STL中的关联式容器map和set的相关概念,主要介绍了它们的概念和使用。
摘星
2023/04/28
7670
C++之map和set
【C++】map和set的使用
  vector、list、dequeforward_list(C++11)等,这些容器统称为 序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。那什么是关联式容器?它与序列式容器有什么区别?
用户11029129
2024/08/14
720
【C++】map和set的使用
【C++】map和set
在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list、deque、 forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身,存储的数据之间没有关联。那什么是关联式容器?它与序列式容器有什么区别?
zxctscl
2024/11/29
1010
【C++】map和set
【C++】map和set使用
前面我们已经接触过STL中的部分容器如:string、vector、list、deque、array、forward_list等,这些容器统称为序列式容器,因为逻辑结构为线性序列的数据结构,两个位置存储的值之间一般没有紧密的关联关系,如交换⼀下,他依旧是序列式容器。顺序容器中的元素是按他们在容器中的存储位置来顺序保存和访问的
用户11290673
2024/10/16
870
map和set的简单介绍
由于博主的能力有限,所以为了方便大家对于map和set的学习,我放一个官方的map和set的链接供大家参考: https://cplusplus.com/
ahao
2024/03/19
770
map和set的简单介绍
【C++/STL】map和set介绍
vector、list、deque等这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。
秦jh
2024/07/23
850
【C++/STL】map和set介绍
【C++】map、set、multimap、multiset的介绍和使用
1. 之前所学的vector,list,deque等容器都是序列式容器,因为他们的底层数据结构都是线性的,并且数据结构中存储的都是元素数据本身,也就是单一的变量。 而下面所学的set、map、multimap、multiset等容器都是关联式容器,他们内部存储的不再是单一的元素数据,存储的而是<key,value>的键值对,由于每个键值对之间都有关联,所以其结构天生就具有优势,在数据检索时效率要比序列式容器高的多。
举杯邀明月
2023/04/12
7460
【C++】map、set、multimap、multiset的介绍和使用
C++:map和set的使用
在学习map和set之前,我们接触到的容器有:vector、list、stack、queue、priority_queue、array,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。
小陈在拼命
2024/04/20
1390
C++:map和set的使用
map和set的概念及使用
树型结构的关联式容器主要有四种:map、set、multimap、multiset四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。
海盗船长
2020/08/27
6510
【C++】详解 set && multiset && map && multiset 的使用
​ 我们已经接触过 STL 中的部分容器,比如:vector、list、deque、forward_list 等,这些容器统称为 序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。至于 stack 和 queue,他们其实不能算是容器,而应该是**容器适配器**,是用 deque 封装的。
利刃大大
2025/02/16
710
【C++】详解 set && multiset && map && multiset 的使用
【c++】set和map的使用
在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list、deque。forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面 存储的是元素本身。那什么是关联式容器?它与序列式容器有什么区别?
用户11029103
2024/05/24
1000
【c++】set和map的使用
【C++】初探 map 与 set
关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高!
叫我龙翔
2024/05/26
710
【C++】初探 map 与 set
C++进阶:详细讲解容器set与map(pair、multiset、multimap)
std::pair 是C++标准库中提供的一个简单的键值对实现。它包含在 <utility> 头文件中。一个 std::pair 有两个公有成员:first 和 second,分别表示键和值==(first<= =>key ; second<= =>value)==
是Nero哦
2024/04/10
4370
C++进阶:详细讲解容器set与map(pair、multiset、multimap)
【C++深度探索】map与set的基础介绍与实用指南
  我们之前已经接触过STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。   而今天我们学习的map、set、multimap、multiset是关联式容器,关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。   根据应用场景的不同,STL总共实现了两种不同结构的关联式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。下面依次介绍每一个容器。
大耳朵土土垚
2024/07/25
1430
【C++深度探索】map与set的基础介绍与实用指南
关联式容器set和map
序列式容器:vector,list,deque,forward_lsit都是序列式容器,因为它们的底层都是线性序列的数据结构,存放的是元素本身。
始终学不会
2023/10/17
2250
关联式容器set和map
相关推荐
移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——13.map&&set
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验