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

【C++】快速上手map、multimap、set、multiset

文章目录

  • 一、前言
  • 二、set / multiset
    • 1. 常见应用
    • 2. 核心操作
  • 三、map / multimap
    • 1. 常见应用
    • 2. 核心操作

一、前言

S T L STL STL 中的关联式容器分为树型结构和哈希结构,树型结构主要有四种: s e t set set m u l t i s e t multiset multiset m a p map map m u l t i m a p multimap multimap,都是用红黑树实现的

与哈希结构不同,树型结构的这几个容器:

  • 增删查改都是 O ( l o g n ) O(logn) O(logn)
  • 支持遍历,遍历结果默认字典序升序

s e t set set m u l t i s e t multiset multiset 中只存 v a l u e value value m a p map map m u l t i m a p multimap multimap 中存的是键值对 < k e y , v a l u e > <key,value> <key,value>

C++ 的键值对是用 p a i r pair pair 实现的,所以 m a p map map m u l t i m a p multimap multimap 存的其实是 p a i r pair pair

template <class T1, class T2>
struct pair
{T1 first;T2 second;pair() : first(T1()), second(T2()) {}pair(const T1& a, const T2& b) : first(a), second(b) {}
};

二、set / multiset

1. 常见应用

s e t set set:排序 + 去重

m u l t i s e t multiset multiset:排序

2. 核心操作

插入

set<int> s1;
multiset<int> s2;//set相同元素不会重复插入
s1.insert(1);
s1.insert(1);//multiset相同元素可以重复插入
s2.insert(1);
s2.insert(1);

删除

s.erase(1);//删除所有values.erase(s.find(1));//删除一个迭代器对应的value

查找

//返回一个value的个数
s.count(1) //返回一个value的第一个迭代器,不存在则返回 end()
s.find(1) 

遍历

//for(auto it = s.begin(); it != s.end(); it++)//cout << *it << ' ';for(auto x : s)cout << x << ' ';

三、map / multimap

m a p map map 的一个 k e y key key 只能对应一个 v a l u e value value

m u l t i m a p multimap multimap 的一个 k e y key key 可以对应多个 v a l u e value value

1. 常见应用

有序的字典

2. 核心操作

插入

map<string, int> m;m.insert(make_pair{"a", 1});
m.insert({"b", 2});//也可以这样写//multimap同理

删除

m.erase("a");//删除一个key对应的所有键值对m.erase(m.find("a"));//删除一个迭代器对应的键值对

查找

//返回一个key对应的键值对个数
m.count("a");//返回一个key对应的键值对的第一个迭代器,不存在则返回 end()
m.find("a");

m a p : : o p e r a t o r [ ] map::operator[] map::operator[]

m["a"] = 1;//map::operator[]的原理
//用<key, T()>构造一个键值对插入
//若key已经存在则插入失败,若key不存在则插入成功
//最后返回value的引用

遍历

//for(auto it = m.begin(); it != m.end(); ++it)//cout << it->first << ' ' << it->second << '\n';//cout << (*it).first << ' ' << (*it).second << '\n';//cout << it.operator->()->first << ' ' << it.operator->()->second << '\n';for(auto& kv : m)cout << kv.first << ' ' << kv.second << '\n';
http://www.lryc.cn/news/299635.html

相关文章:

  • 【分享】图解ADS+JLINK调试ARM
  • 反无人机系统技术分析,无人机反制技术理论基础,无人机技术详解
  • Kotlin和Java 单例模式
  • 软考 系统分析师系列知识点之信息系统战略规划方法(9)
  • 政安晨:示例演绎TensorFlow的官方指南(一){基础知识}
  • node - 与数据库交互
  • 速盾:2024年cdn在5g时代重要吗
  • 微信小程序(四十一)wechat-http的使用
  • 所有设计模式大全及学习链接
  • 【Java程序设计】【C00264】基于Springboot的原创歌曲分享平台(有论文)
  • 2024年,要特别注意这两个方位
  • 【Chrono Engine学习总结】5-sensor-5.1-sensor基础并创建一个lidar
  • springboot/ssm学生信息管理系统Java学生在线选课考试管理系统
  • three.js 箭头ArrowHelper的实践应用
  • 力扣hot2--哈希
  • 【正在更新】从零开始认识语音识别:DNN-HMM混合系统语音识别(ASR)原理
  • thinkphp+vue企业产品展示网站f7enu
  • 在Ubuntu22.04上部署ComfyUI
  • Springboot+vue的社区养老服务平台(有报告)。Javaee项目,springboot vue前后端分离项目
  • 计算机设计大赛 深度学习+opencv+python实现车道线检测 - 自动驾驶
  • 机器学习2---逻辑回归(基础准备)
  • JVM体系
  • .NET命令行(CLI)常用命令
  • 六、Redis之数据持久化及高频面试题
  • 爬虫——ajax和selenuim总结
  • 【Python】单元测试unittest框架
  • (三十七)大数据实战——Solr服务的部署安装
  • 在Ubuntu22.04上部署FoooCUS2.1
  • 详解C语言中的野指针和assert断言
  • Vue源码系列讲解——模板编译篇【四】(文本解析器)