C++中的map和set的使用

news2024/12/24 11:44:41

C++中的map详解

  • 关联式容器
  • 键值对
  • 树形结构的关联式容器
  • set的使用
    • 1. set的模板参数列表
    • 2. set的构造
    • 3. set的迭代器
    • 4. set的容量
    • 5. set修改操作
    • 6. set的使用举例
  • map
    • 1. map的简介
    • 2. map的模板参数说明
    • 3. map的构造
    • 4. map的迭代器
    • 5. map的容量与元素访问
    • 6. map的元素修改
  • multimap和multiset的使用

关联式容器

我们已经知道STL中的部分容器,比如:vector、list、deque、
list
等,这些容器统称为序列式容器因为其底层为线性序列的数据结构,里面存储的是元素本身。那什么是关联式容器?它与序列式容器有什么区别?
关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。

键值对

用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。比如:现在要建立一个英汉互译的字典,那该字典中必然有英文单词与其对应的中文含义,而且,英文单词与其中文含义是一一对应的关系,即通过该应该单词,在词典中就可以找到与其对应的中文含义。

SGI-STL中关于键值对(pair)的定义:

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& a, const T2& b): first(a), second(b)
	{}
};

树形结构的关联式容器

根据应用场景的不同,STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列

set的使用

1. set的模板参数列表

在这里插入图片描述

2. set的构造

在这里插入图片描述

3. set的迭代器

在这里插入图片描述

4. set的容量

在这里插入图片描述

5. set修改操作

在这里插入图片描述

6. set的使用举例

#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& 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;
}

map

1. map的简介

mapd的介绍文档
阅读map容器中的函数时三个重要的typedef的变量:
在这里插入图片描述

翻译:

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

2. map的模板参数说明

在这里插入图片描述

3. map的构造

在这里插入图片描述

4. map的迭代器

在这里插入图片描述

5. map的容量与元素访问

在这里插入图片描述
问题:当key不在map中时,通过operator获取对应value时会发生什么问题?
在这里插入图片描述
注意:在元素访问时,有一个与operator[]类似的操作at()(该函数不常用)函数,都是通过key找到与key对应的value然后返回其引用,不同的是:当key不存在时,operator[]用默认value与key构造键值对然后插入,返回该默认value,at()函数直接抛异常。

6. map的元素修改

在这里插入图片描述


在这里插入图片描述

在这里插入图片描述


在这里插入图片描述
在这里插入图片描述
返回值:
在这里插入图片描述

#include <iostream>
using namespace std;
#include <string>
#include <map>
void TestMap()
{
    map<string, string> m;
    // 向map中插入元素的方式:
    // 将键值对<"peach","桃子">插入map中,用pair直接来构造键值对
    m.insert(pair<string, string>("peach", "桃子"));
    // 将键值对<"peach","桃子">插入map中,用make_pair函数来构造键值对
    m.insert(make_pair("banan", "香蕉"));

    // 借用operator[]向map中插入元素
       /*
    operator[]的原理是:
     用<key, T()>构造一个键值对,然后调用insert()函数将该键值对插入到map中
     如果key已经存在,插入失败,insert函数返回该key所在位置的迭代器
     如果key不存在,插入成功,insert函数返回新插入元素所在位置的迭代器
     operator[]函数最后将insert返回值键值对中的value返回
    */
    // 将<"apple", "">插入map中,插入成功,返回value的引用,将“苹果”赋值给该引
    // 用结果,
        m["apple"] = "苹果";
    // key不存在时抛异常
    //m.at("waterme") = "水蜜桃";
    cout << m.size() << endl;
    // 用迭代器去遍历map中的元素,可以得到一个按照key排序的序列
    for (auto& e : m)
        cout << e.first << "--->" << e.second << endl;
    cout << endl;
    // map中的键值对key一定是唯一的,如果key存在将插入失败
    auto ret = m.insert(make_pair("peach", "桃色"));
    if (ret.second)
        cout << "<peach, 桃色>不在map中, 已经插入" << endl;
    else
        cout << "键值为peach的元素已经存在:" << ret.first->first << "--->"
        << ret.first->second << " 插入失败" << endl;
    // 删除key为"apple"的元素
    m.erase("apple");
    if (1 == m.count("apple"))
        cout << "apple还在" << endl;
    else
        cout << "apple被吃了" << endl;
}


【map总结】

  1. map中的的元素是键值对
  2. map中的key是唯一的,并且不能修改
  3. 默认按照小于的方式对key进行比较
  4. map中的元素如果用迭代器去遍历,可以得到一个有序的序列
  5. map的底层为平衡搜索树(红黑树),查找效率比较高 O ( l o g 2 N ) O(log_2 N) O(log2N)
  6. 支持[]操作符,operator[]中实际进行插入查找。

multimap和multiset的使用

multimap和multiset的使用

(本章完)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习之危险品车辆目标检测

危险品的运输涉及从离开仓库到由车辆运输到目的地的风险。监控事故、车辆运动动态以及车辆通过特定区域的频率对于监督车辆运输危险品的过程至关重要。 在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数…

js实现获取原生form表单的数据序列化表单以及将数组转化为一个对象obj,将数组中的内容作为对象的key转化为对象,对应的值转换为对象对应的值

1.需求场景 哈喽 大家好啊&#xff0c;今天遇到一个场景&#xff0c; js实现获取原生form表单的数据序列化表单以及将数组转化为一个对象obj&#xff0c;将数组中的内容作为对象的key转化为对象&#xff0c;对应的值转换为对象对应的值 数组对象中某个属性的值&#xff0c;转…

开店必看!又有新变化?一文读懂2024亚马逊卖家入驻要求和流程

亚马逊2024年新卖家入驻正在火热进行中&#xff0c;想加入亚马逊卖家行列的小伙伴们准备好了吗&#xff1f;9月20日&#xff0c;亚马逊官方宣布2024年新卖家入驻正式开启&#xff0c;又一年招商季来临&#xff0c;东哥还了解到2024年亚马逊卖家注册要求有了一点新变化&#xff…

白银现货怎么开户,需要投入多少钱?

在白银投资市场中&#xff0c;有一种交易产品种类&#xff0c;它能够提供给人们稳定的理财环境&#xff0c;还具有辨别的交易环境。这种白银理财产品就是现货白银&#xff0c;也有一部分投资者将其称为白银现货。为了人们对这一产品具有更加清晰的认识&#xff0c;今天万洲金业…

行情分析 - - 加密货币市场大盘走势(11.23)

大饼昨日又开始了回调&#xff0c;因为FTF消息&#xff0c;而实际还是要下跌的&#xff0c;耐心等待即可。 空单策略&#xff1a;入场37300 止盈34000-33000 止损39000 以太昨日上涨也很激励&#xff0c;目前上涨打了止损&#xff0c;现在入场是好的机会&#xff0c;等待即可。…

揭开未来:塑造数字营销的尖端技术

介绍 对于企业来说&#xff0c;要想在瞬息万变的数字营销世界中取得成功&#xff0c;领先一步至关重要。技术正在以惊人的速度发展&#xff0c;开辟了新的机会&#xff0c;正在改变营销人员与消费者的互动方式。这篇文章的目的是重点介绍重新定义数字营销领域的十大创新技术。…

周末在家怎么玩?极米投影仪RS Pro 3大屏娱乐带你玩转假期

其实平时上班&#xff0c;很多娱乐活动没时间玩&#xff0c;想看的剧也还肯定都没看&#xff0c;趁着周末正好可以都补起来。要想在家玩转假期&#xff0c;选择一款合适的装备就非常重要了&#xff0c;比如极米科技这款4K旗舰投影极米RS Pro 3就挺不错的。有了极米RS Pro 3&…

ubuntu22.04在线安装redis,可选择版本

安装脚本7.0.5版本 在线安装脚本&#xff0c;默认版本号是7.0.5&#xff0c;可以根据需要选择需要的版本进行下载编译安装 sudo apt-get install gcc -y sudo apt-get install pkg-config -y sudo apt-get install build-essential -y#安装redis rm -rf ./tmp.log systemctl …

世微 多功能 LED降压型恒流芯片内置2.2A LED摩托车灯 全亮 半亮 爆闪 AP2403

产品描述 AP2403 是一款 PWM 工作模式,内置功率管&#xff0c;适用于 5-100V 输入的高精度降压 LED 恒流驱动芯片。输出功率可达 22W&#xff0c;电流 2.2A。AP2403 可实现三段功能切换&#xff0c;通过 MODE1/2/3 切换三种功能模式&#xff1a;全亮&#xff0c;半亮&#xff0…

基于YOLO模型建筑工地个人防护设备目标检测

使用安全装备可以保护他们免受建筑工地的意外事故。据统计&#xff0c;每年有数以万计的工人在建筑工地受到严重伤害&#xff0c;造成终生困难。然而&#xff0c;通过自我监控来确保工人穿戴个人防护装备非常重要。在这方面&#xff0c;需要一个准确和快速的系统来检测工人是否…

[前端] V8引擎编译原理

文章目录 1.什么是V81.1 扫描器Scanner1.2 解析器parser1.3 预解析PreParser1.4 解释器Ignition1.5 编译器TurboFan 1.什么是V8 V8是谷歌的开源高性能JavaScript和WebAssembly引擎&#xff0c;用C编写。它被用于Chrome和Node.js等。它实现ECMAScript和WebAssembly&#xff0c;…

浅谈Jmeter接口测试

前言 接口测试是目前最主流的自动化测试手段&#xff0c;将不同的参数组合起来向服务器发送请求&#xff0c;接受和分析响应结果&#xff0c;通过测试数据交换逻辑验证服务端程序的运行正确性。 我们在测试中需要考虑不同的输入组合以涵盖不同的测试范围 1、Jmeter简介 Jmet…

实现了一个简易的计算器

计算器的界面如下&#xff1a; 实现过程&#xff1a; 通过html和css编写这样一个界面JavaScript实现功能 在通过JavaScript实现计算器功能的过程中&#xff0c;其实使用的都是一些基本指数。主要包括以下几点&#xff1a; If/else 分支.For 循环JavaScript 函数箭头函数&…

DRAM(Distilling and Refining Annotations of Metabolism,提取和精练代谢注释)工具安装和使用

先看文章介绍吧&#xff1a;DRAM for distilling microbial metabolism to automate the curation of microbiome function | Nucleic Acids Research | Oxford Academic (oup.com) 1、安装 默认使用conda安装吧&#xff0c;也建议使用conda&#xff0c;pip安装其实都差不多&a…

低代码表单设计器:可视化+灵活+易操作,降本增效轻松实现!

在现代化办公环境中&#xff0c;拥有先进的低代码表单设计器&#xff0c;可以让企业降本又增效&#xff0c;节约企业成本的同时&#xff0c;也能高效利用企业内部资源&#xff0c;为实现数字化转型升级提供夯实根基。那么&#xff0c;低代码表单设计器拥有什么样的特点&#xf…

志愿服务暖人心,村委致谢送锦旗

“衷心感谢济宁市运河义工服务协会对我们村里的大学生凯凯一直以来的关注和帮扶。真是太谢谢您们了&#xff0c;如不是您们的帮助孩子也不能那么放心地去上大学&#xff0c;毕竟家里有从小就相依为命的年迈的奶奶&#xff0c;是他一直的担心和牵挂&#xff0c; 咱们协会不仅对孩…

Django中间件与csrf

一. django中间件 1. 什么是django中间件 # django中间件是django的门户1. 请求来的时候需要先经过中间件才能到达真正的django后端2. 响应走的时候最后也需要经过中间件才能发送出去 2. django中间件的个数 django自带七个中间件, 分别是SecurityMiddleware, SessionMiddle…

Linux宝塔面板搭建Discuz论坛, 并内网穿透实现公网访问

Linux宝塔面板搭建Discuz论坛&#xff0c; 并内网穿透实现公网访问 文章目录 Linux宝塔面板搭建Discuz论坛&#xff0c; 并内网穿透实现公网访问前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛 &#x1f4f7; 江池…

深兰科技“汉境”入选2023年湖北省人工智能十大优秀应用案例

11月18日&#xff0c;央视“专精特新制造强国”城市大会在湖北武汉召开。会上&#xff0c;正式发布了“湖北省工业互联网标识十大优秀应用案例”&#xff0c;由深兰科技(武汉)股份有限公司基于AIGC多模态融合大模型技术开发打造的江汉路步行街元宇宙场景应用——汉境&#xff0…