当前位置: 首页 > ds >正文

map和set的应用总结

目录

1.map和set

2.set系列的使用

1.set和multiset的使用文档介绍

2.set类的介绍

​编辑

3.迭代器的使用

3.set和multise的差别

4.map的使用

5.pair

6.这里介绍一下map的[]的使用方法

7.题目练习

下面我们借助一个题目来熟悉一下map和multimap的接口,体会一下k-v的使用方法:

​编辑


1.map和set

set存储的是key值,map存储的是key-value值,它们都属于关联式容器,正常情况下map和set不支持冗余,想要插入相同的数据,需要使用multiset和multimap来进行冗余数据的插入,这里冗余指的是key值相等。

2.set系列的使用

1.set和multiset的使用文档介绍

https://legacy.cplusplus.com/reference/set/

2.set类的介绍

库中给出了set的一些接口,我们介绍一下,和其他容器一样,set也支持迭代器,它的迭代是中序遍历,insert是插入一个数据,这里插入之后会自动进行排序,find是在set中寻找你想要的值,找到返回迭代器,未找到返回end(),count是返回容器中有一个要寻找的值,未找到返回0.

3.迭代器的使用

这里要注意一下,set的迭代器不能修改数据,因为一旦修改数据,会导致树的结构错乱,破坏了树结构。

3.set和multise的差别

set不支持冗余数据的插入,multise支持冗余数据的插入。

4.map的使用

map和set的区别是它支持key-value的插入,我们不可以修改key值,但是可以修改value的值,它本质是加了一个变量value来帮助我们实现更多的功能,比如字典某一个字母出现的次数。它的查找效率是logN。

5.pair

map底层的红⿊树节点中的数据,使⽤pair<Key, T>存储键值对数据。

6.这里介绍一下map的[]的使用方法

map的[]里应该是key值,如果有,则返回value的值,没有则插入。

下列代码中,如果在map中未找到str,就会插入,并且value值+1。

int main()
{// 利⽤[]插⼊+修改功能,巧妙实现统计⽔果出现的次数string arr[] = { "苹果", "西⽠", "苹果", "西⽠", "苹果", "苹果", "西⽠","苹果", "⾹蕉", "苹果", "⾹蕉" };map<string, int> countMap;for (const auto& str : arr){// []先查找⽔果在不在map中// 1、不在,说明⽔果第⼀次出现,则插⼊{⽔果, 0},同时返回次数的引⽤,// 2、在,则返回⽔果对应的次数++countMap[str]++;}for (const auto& e : countMap){cout << e.first << ":" << e.second << endl;}cout << endl;return 0;
}
int main()
{
map<string, string> dict;
dict.insert(make_pair("sort", "排序"));
// key不存在->插⼊ {"insert", string()}
dict["insert"];
// 插⼊+修改
dict["left"] = "左边";
// 修改
dict["left"] = "左边、剩余";
// key存在->查找
cout << dict["left"] << endl;
return 0;
}

7.题目练习

下面我们借助一个题目来熟悉一下map和multimap的接口,体会一下k-v的使用方法:

这道题目让我们打印各个单词出现的次数,我们先把这个stringd单词存到map中去,让它的字母按顺序排,然后按降序再存入map<int,string,greater<int>>中去,方便我们的打印,这样第一次存我们按照字母的顺序存入,第二次存入我们按照出现次数进行存入,既保证了次数相同字母的出现顺序,又保证了从大到小的存入。

注:二次存入的一个原因是key无法修改,只能修改v,如果我们只存入一次,第一次只会得到字母的顺序,无法得到按v的顺序,第二次存入是得到v的顺序和k的顺序。

下面我们给出相应的代码参考

#include<iostream>
#include<map>
using namespace std;
int main() 
{string a;map<string, int>mup;int count = 0;while (cin >> a){if (a[0] <= 'Z' && a[0] >= 'A'){a[0] = a[0] + 32;}if (a[a.size()-1] == '.'){a.pop_back();auto it1= mup.find(a);if (it1 == mup.end()){mup.insert({ a, 1 });}else{mup[a]++;}break;}else{auto it = mup.find(a);if (it == mup.end()){mup.insert({ a, 1 });}else{mup[a]++;}}}multimap<int, string, greater<int>>mup2;for (auto e : mup){mup2.insert({ e.second,e.first });}for (auto e : mup2){cout << e.second << ":" << e.first << endl;}return 0;
}


 

http://www.xdnf.cn/news/2391.html

相关文章:

  • MySQL 常用语句教程
  • Python数值类型修炼手册:从青铜到王者的进阶之路
  • Buffer Pool是什么,有什么作用
  • 【MATLAB第118期】基于MATLAB的双通道CNN多输入单输出分类预测方法
  • Android学习总结之协程对比优缺点(协程一)
  • 腾讯云智三道算法题
  • 侵水防触电的原理是什么? 侵水防触电算先进技术吗?-优雅草卓伊凡
  • 【Redis——通用命令】
  • 写时拷贝讲解
  • SQL:MySQL 函数
  • Eigen库入门
  • 博客文章格式更新2.0
  • N维漂洛界的定义和参数方程
  • 算法设计课作业
  • 【概念】什么是 JWT Token?
  • JAVA多线程(8.0)
  • matlab实现稀疏低秩去噪
  • day7 python针对心脏病数据集预处理
  • Java ThreadLocal与内存泄漏
  • 黑马Java基础笔记-4
  • 青少年CTF-贪吃蛇
  • YOLOv11改进:RevColV1可逆列目标检测网络(特征解耦助力小目标检测)
  • 写入cache时数据格式错误产生的ERRO导致整个测试框架无法运行
  • 大模型时代的语言格局演变:为什么是 JavaScript?
  • PyTorch数据加载与预处理
  • 模板引擎语法-过滤器
  • TeaCache原理及代码
  • 泛型进阶之通配符
  • import tree # pip install dm_tree ModuleNotFoundError: No module named ‘tree‘
  • 如何导出1寸分辨率为300及以上的照片?