【C++】STL——map的介绍和使用、map的构造函数、map的迭代器、map的容量和访问函数、map的增删查改函数

news2025/1/15 22:51:29

文章目录

  • 1.map的介绍
  • 2.map的使用
    • 2.1map的构造函数
    • 2.2map的迭代器
    • 2.3map的容量和访问函数
    • 2.4map的增删查改函数

1.map的介绍

map的介绍

在这里插入图片描述

  (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的使用

在这里插入图片描述

  map提供的模版参数列表:

  key: 键值对中key的类型

  T: 键值对中value的类型

  Compare: 比较器的类型, map中的元素是按照key来比较的,缺省情况下按照小于来比较,一般情况下(内置类型元素)该参数不需要传递,如果无法比较时(自定义类型),需要用户自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递)

  Alloc:通过空间配置器来申请底层空间, 不需要用户传递,除非用户不想使用标准库提供的空间配置器

              

2.1map的构造函数

在这里插入图片描述

map提供了三种构造函数:

函数声明功能介绍
map (const Compare& comp = Compare(), const Allocator& = Allocator() );构造空的map
map(InputIterator first, InputIterator last, const Compare& comp = Compare(), const Allocator& = Allocator(());用[first, last)区间中的元素构造map
map( const map<Key,Compare,Allocator>& x);map的拷贝构造

  以下是一些set构造函数的简单示例:

//1.默认构造函数:创建一个空的map对象。
std::map<int, std::string> myMap;
//通过传入键值对来创建map对象。
std::map<int, std::string> myMap = {{1, "apple"}, {2, "banana"}, {3, "orange"}};

//2.用迭代器构造:通过使用迭代器范围来构造map对象。
std::vector<std::pair<int, std::string>> vec = {{1, "apple"}, {2, "banana"}, {3, "orange"}};
std::map<int, std::string> myMap(vec.begin(), vec.end());

//3.拷贝构造函数:通过拷贝另一个map对象来创建一个新的map对象。
std::map<int, std::string> originalMap = {{1, "apple"}, {2, "banana"}, {3, "orange"}};
std::map<int, std::string> copiedMap(originalMap);

              

2.2map的迭代器

在这里插入图片描述

在这里插入图片描述

和set一样,map也有同样的迭代器:

函数声明功能介绍
begin()和end()begin:首元素的位置,end最后一个元素的下一个位置
cbegin()和cend()与begin和end意义相同,但cbegin和cend所指向的元素不能修改
rbegin()和rend()反向迭代器,rbegin在end位置,rend在begin位置,其++和–操作与begin和end操作移动相反
crbegin()和crend()与rbegin和rend位置相同,操作相同,但crbegin和crend所指向的元素不能修改

map的迭代器的使用示例:

#include <iostream>
#include <map>

int main() {
    std::map<int, std::string> myMap = {{1, "apple"}, {2, "banana"}, {3, "orange"}};

    // 正向迭代器
    std::map<int, std::string>::iterator it;
    std::cout << "正向迭代器:" << std::endl;
    for (it = myMap.begin(); it != myMap.end(); ++it) {
        std::cout << it->first << ": " << it->second << std::endl;
    }

    // 逆向迭代器
    std::map<int, std::string>::reverse_iterator rit;
    std::cout << "逆向迭代器:" << std::endl;
    for (rit = myMap.rbegin(); rit != myMap.rend(); ++rit) {
        std::cout << rit->first << ": " << rit->second << std::endl;
    }

    // 常量迭代器
    std::map<int, std::string>::const_iterator cit;
    std::cout << "常量迭代器:" << std::endl;
    for (cit = myMap.cbegin(); cit != myMap.cend(); ++cit) {
        std::cout << cit->first << ": " << cit->second << std::endl;
    }

    return 0;
}

//正向迭代器:
//1: apple
//2: banana
//3: orange
//逆向迭代器:
//3: orange
//2: banana
//1: apple
//常量迭代器:
//1: apple
//2: banana
//3: orange

              

2.3map的容量和访问函数

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  注意:在元素访问时,有一个与operator[]类似的操作at()(该函数不常用)函数,都是通过key找到与key对应的value然后返回其引用,不同的是:当key不存在时,operator[]用默认value与key构造键值对然后插入,返回该默认value,at()函数直接抛异常。

函数声明功能简介
bool empty ( ) const检测map中的元素是否为空,是返回true,否则返回false
size_type size() const返回map中有效元素的个数
mapped_type& operator[] (const key_type& k)返回去key对应的value

  map的容量和访问函数使用:

  在示例中,首先使用empty函数检查map是否为空,然后使用size函数获取map的大小。接下来,使用operator[]函数插入键值对到map中。再次使用empty函数和size函数检查map的状态。最后,使用operator[]函数访问map中的值。

#include <iostream>
#include <map>

int main() {
    std::map<int, std::string> myMap;

    // 使用empty函数检查map是否为空
    if (myMap.empty()) {
        std::cout << "Map is empty" << std::endl;
    } else {
        std::cout << "Map is not empty" << std::endl;
    }

    // 使用size函数获取map的大小
    std::cout << "Map size: " << myMap.size() << std::endl;

    // 使用operator[]函数插入键值对
    myMap[1] = "apple";
    myMap[2] = "banana";
    myMap[3] = "orange";

    // 再次使用empty函数检查map是否为空
    if (myMap.empty()) {
        std::cout << "Map is empty" << std::endl;
    } else {
        std::cout << "Map is not empty" << std::endl;
    }

    // 再次使用size函数获取map的大小
    std::cout << "Map size: " << myMap.size() << std::endl;

    // 使用operator[]函数访问map中的值
    std::cout << "Value at key 2: " << myMap[2] << std::endl;

    return 0;
}

//Map is empty
//Map size: 0
//Map is not empty
//Map size: 3
//Value at key 2: banana

              

2.4map的增删查改函数

在这里插入图片描述

函数声明功能简介
pair<iterator,bool> insert ( const value_type& x )在map中插入键值对x,注意x是一个键值对,返回值也是键值对:iterator代表新插入元素的位置,bool代表释放插入成功
void erase ( iterator position )删除position位置上的元素
size_type erase ( const key_type& x )删除键值为x的元素
void erase ( iterator first, iterator last )删除[first, last)区间中的元素
void swap ( map<Key,T,Compare,Allocator>& mp )交换两个map中的元素
void clear ( )将map中的元素清空
iterator find ( const key_type& x )在map中插入key为x的元素,找到返回该元素的位置的迭代器,否则返回end
const_iterator find ( const key_type& x ) const在map中插入key为x的元素,找到返回该元素的位置的const迭代器,否则返回cend
size_type count ( const key_type& x ) const返回key为x的键值在map中的个数,注意map中key是唯一的

  这里简单举例map的insert和erase:

#include <iostream>
#include <map>

int main() {
    std::map<int, std::string> myMap;

    // 使用insert函数插入键值对
    myMap.insert(std::make_pair(1, "apple"));
    myMap.insert(std::make_pair(2, "banana"));
    myMap.insert(std::make_pair(3, "orange"));

    // 打印插入后的map
    std::cout << "Map after insert:" << std::endl;
    for (const auto& pair : myMap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    // 使用erase函数删除键值对
    myMap.erase(2);

    // 打印删除后的map
    std::cout << "Map after erase:" << std::endl;
    for (const auto& pair : myMap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    return 0;
}

//Map after insert:
//1: apple
//2: banana
//3: orange
//Map after erase:
//1: apple
//3: orange

              

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

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

相关文章

WPS右键新建没有docx pptx xlsx 修复

解决wps右键没有新建文档的问题 右键没有新建PPT和Excel 1 wps自带的修复直接修复没有用 以上不管咋修复都没用 2 先编辑注册表 找到 HKEY_CLASSES_ROOT CTRLF搜文件扩展名 pptx docx xlsx 新建字符串 三种扩展名都一样操作 注册表编辑之后再次使用wps修复 注册组件&am…

Docker Desktop 笔记

https://blog.csdn.net/qq_39611230/article/details/108641842 https://blog.csdn.net/KgdYsg/article/details/118213499 1、修改配置 {"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://…

PHP自己的框架session()使用(完善篇六)

1、PHP自己的框架session() 2、session类&#xff08;SessionBase.php&#xff09; <?php class SessionBase {/*** 设置session*/public static function set($name, $data, $expire600){$session_data array();$session_data[data] $data;$session_data[expire] time…

Vue使用Animate.css

说一下Animate.css这个动画库&#xff0c;很多的动画在这个库里面都定义好了&#xff0c;我们用的时候可以直接使用里面的类名就可以了&#xff0c;就是直接目标元素绑定对应的类名就可以实现动画效果&#xff0c;非常方便&#xff0c;库其实也相对简单&#xff0c;使用起来也简…

IDEA 一键清除所有的无效引用

快捷键 // windows版本 CtrlAltO//mac版本 controloptionO 使用方式 1. 清除单个类中的无效的import, 打开具体的类。然后使用快捷键。 2. 清除整个项目的无效引用&#xff0c;左键点击项目名&#xff0c;然后使用快捷键&#xff0c;会出现以下提示。按Run即可。

21.2 CSS 三大特性与页面布局

1. 开发者工具修改样式 使用开发者工具修改样式, 操作步骤如下: * 1. 打开开发者工具: 在浏览器中右键点击页面, 然后选择检查或者使用快捷键(一般是 F12 或者 CtrlShiftI)来打开开发者工具.* 2. 打开样式编辑器: 在开发者工具中, 找到选项卡或面板, 一般是Elements或者Elemen…

2. HBase中文学习手册之如何运行一个单机版的HBase?

HBase中文学习手册之如何运行一个单机版的HBase? 1.1 介绍1.2 快速开始1.2.1 安装 Open JDK 81.2.2 启动 HBase1.2.3 Shell 练习1.2.4 运行停止脚本来停止HBase 1.1 介绍 上篇博文HBase中文学习手册之揭开Hbase的神秘面纱分享了 HBase 的一些理论基础知识的介绍。 本文将会继…

MAYA粒子基础_场

重力场 牛顿场 径向场 均匀场和重力场的区别 空气场 推动物体 阻力场 推动物体 涡流场 湍流场 体积轴场

ubuntu 22.04 LTS openai triton 安装

第一种方法&#xff1a; pip install triton 第二种方法&#xff0c;安装最新的版本&#xff1a; pip install -U --index-url https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/Triton-Nightly/pypi/simple/ triton-nightly 第三种方法&#xff1a; git c…

[NLP]LLM--transformer模型的参数量

1. 前言 最近&#xff0c;OpenAI推出的ChatGPT展现出了卓越的性能&#xff0c;引发了大规模语言模型(Large Language Model, LLM)的研究热潮。大规模语言模型的“大”体现在两个方面&#xff1a;模型参数规模大&#xff0c;训练数据规模大。以GPT3为例&#xff0c;GPT3的参数量…

2023年8月23日博客更新

首发博客地址 https://blog.zysicyj.top/ 新增相册集和结婚相册 https://blog.zysicyj.top/gallery/ 相册整理不容易呀&#xff0c;后续有机会再慢慢整理吧&#xff0c;相册慢慢加上 我选择了大图展示&#xff0c;这种高清图片&#xff0c;我觉得还是大点的好&#xff0c;默认…

【广州华锐互动】牲畜养殖VR模拟实操系统为传统教育注入新的生命力

随着科技的不断发展&#xff0c;虚拟现实(VR)技术已经逐渐走进我们的生活。在农业领域&#xff0c;VR技术的应用也日益广泛&#xff0c;为现代农业人才培养提供了新的途径。 由广州华锐互动开发的“牲畜养殖VR模拟实操系统”引起了广泛关注&#xff0c;系统包含了鸡、猪、牛、马…

蓝蓝设计-UI设计公司案例-HMI列车监控系统界面设计解决方案

2013年&#xff0c;为加拿大庞巴迪(Bombardier)设计列车监控系统界面设计。 2015-至今&#xff0c;为中车集团旗下若干公司提供HMI列车监控系统界面设计,综合考虑中车特点、城轨车、动车组的不同需求以及HMI硬键屏和触摸 屏的不同操作方式&#xff0c;重构框架设计、交互设计、…

借助frp的xtcp+danted代理打通两边局域网p2p方式访问

最终效果 实现C内网所有设备借助c1内网代理访问B内网所有服务器 配置公网服务端A frps 配置frps.ini [common] # 绑定frp穿透使用的端口 bind_port 7000 # 使用token认证 authentication_method token token xxxx./frps -c frps.ini启动 配置service自启(可选) /etc/…

密码学学习笔记(二十一):SHA-256与HMAC、NMAC、KMAC

SHA-256 SHA-2是广泛应用的哈希函数&#xff0c;并且有不同的版本&#xff0c;这篇博客主要介绍SHA-256。 SHA-256算法满足了哈希函数的三个安全属性&#xff1a; 抗第一原像性 - 无法根据哈希函数的输出恢复其对应的输入。抗第二原像性 - 给定一个输入和它的哈希值&#xf…

SQLite、MySQL、PostgreSQL3个关系数据库之间的对比

引言 关系数据模型以行和列的表格形式组织数据&#xff0c;在数据库管理工具中占主导地位。今天还有其他数据模型&#xff0c;包括NoSQL和NewSQL&#xff0c;但是关系数据库管理系统&#xff08;RDBMS&#xff09;仍然占主导地位用于存储和管理全球数据。 本文比较了三种实现最…

Cassandra初识

1、Cassandra支持宽列数据&#xff0c;mysql的话就需要分表了&#xff1b; 2、Cassandra支持命令行查看集群状态&#xff0c;直接输入cqlsh即可&#xff0c;然后可以select&#xff0c;可以create&#xff0c;可以alter&#xff1b; 3、Cassandra有个key space的概念&#xf…

【电商领域】Axure在线购物商城小程序原型图,抖音商城垂直电商APP原型

作品概况 页面数量&#xff1a;共 60 页 兼容软件&#xff1a;Axure RP 9/10&#xff0c;不支持低版本 应用领域&#xff1a;网上商城、品牌自营商城、商城模块插件 作品申明&#xff1a;页面内容仅用于功能演示&#xff0c;无实际功能 作品特色 本作品为品牌自营网上商城…

cookie+session

文章目录 0. 概念1.Cookie1.1 Cookie快速入门1.2 原理1.3 cookie的存活时间1.3 cookie的存储中文 2.Session2.1 Session快速入门2.2 Session原理2.3 Session 存储时间2.4 Session销毁 3. Cookie和Session小结4. 案例-登录注册记录密码4.1 登录功能4.2 记住我-设置cookie4.2 注册…

概念解析 | 稀疏正则化

稀疏正则化&#xff1a;从理论到实践的简要解析 注1&#xff1a;本文系“概念解析”系列之一&#xff0c;致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是&#xff1a;稀疏正则化。 Group-sparsity regularization enforcement: (a) the columns of the… | Dow…