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

c++ 11标准模板(STL) std::map(四)

定义于头文件<map>

template<

    class Key,
    class T,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<std::pair<const Key, T> >

> class map;
(1)
namespace pmr {

    template <class Key, class T, class Compare = std::less<Key>>
    using map = std::map<Key, T, Compare,
                         std::pmr::polymorphic_allocator<std::pair<const Key,T>>>

}
(2)(C++17 起)

std::map 是有序键值对容器,它的元素的键是唯一的。用比较函数 Compare 排序键。搜索、移除和插入操作拥有对数复杂度。 map 通常实现为红黑树。

在每个标准库使用比较 (Compare) 概念的位置,以等价关系检验唯一性。不精确而言,若二个对象 ab 互相比较不小于对方 : !comp(a, b) && !comp(b, a) ,则认为它们等价(非唯一)。

std::map 满足容器 (Container) 、具分配器容器 (AllocatorAwareContainer) 、关联容器 (AssociativeContainer) 和可逆容器 (ReversibleContainer) 的要求。


元素访问

访问指定的元素,同时进行越界检查

std::map<Key,T,Compare,Allocator>::at

T& at( const Key& key );

(1)(C++11 起)

const T& at( const Key& key ) const;

(2)(C++11 起)

返回到拥有等于 key 的关键的元素被映射值的引用。若无这种元素,则抛出 std::out_of_range 类型异常。

参数

key-要找到的元素的关键

返回值

到请求元素的被映射值的引用

异常

若容器无拥有指定 key 的元素则为 std::out_of_range

复杂度

与容器大小成对数。

访问或插入指定的元素

std::map<Key,T,Compare,Allocator>::operator[]

T& operator[]( const Key& key );

(1)

T& operator[]( Key&& key );

(2)(C++11 起)

返回到映射到等于 key 的关键的值的引用,若这种关键不存在则进行插入。

1) 若关键不存在则插入 value_type(key, T()) 。此函数等价于 return insert(std::make_pair(key, T())).first->second;
- key_type 必须满足可复制构造 (CopyConstructible) 的要求。
- mapped_type 必须满足可复制构造 (CopyConstructible) 和 可默认构造 (DefaultConstructible) 的要求。
若进行插入,则值初始化被映射值(对类类型为默认构造,否则为零初始化)并返回到它的引用。
(C++11 前)
1) 若关键不存在,则插入从 std::piecewise_construct, std::forward_as_tuple(key), std::tuple<>() 原位构造的 value_type 对象。此函数等价于 return this->try_emplace(key).first->second; 。 (C++17 起)
使用默认分配器时,这导致从 key 复制构造关键,并值初始化被映射值。
- value_type 必须从 std::piecewise_construct, std::forward_as_tuple(key), std::tuple<>() 可就位构造 (EmplaceConstructible) 。使用默认分配器时,这表明 key_type 必须可复制构造 (CopyConstructible) 而 mapped_type 必须可默认构造 (DefaultConstructible) 。
2) 若关键不存在,则插入从 std::piecewise_construct, std::forward_as_tuple(std::move(key)), std::tuple<>() 原位构造的 value_type 对象。此函数等价于 return this->try_emplace(std::move(key)).first->second; 。 (C++17 起)
使用默认分配器时,这导致从 key 移动构造关键,并值初始化被映射值。
- value_type 必须从 std::piecewise_construct, std::forward_as_tuple(std::move(key)), std::tuple<>() 可就位构造 (EmplaceConstructible) 。使用默认分配器时,这表明 key_type 必须可移动构造 (MoveConstructible) mapped_type 必须可默认构造 (DefaultConstructible) 。
(C++11 起)

没有迭代器或引用被非法化。

参数

key-要寻找的元素关键

返回值

若不存在拥有关键 key 的元素,则为到新元素被映射值的引用。否则为到既存的关键等价于 key 的元素的被映射值的引用。

异常

若任何操作抛出异常,则插入无效果。

复杂度

与容器大小成对数。

注意

出版的 C++11 和 C++14 标准中,指定此函数要求 mapped_type可默认插入 (DefaultInsertable) 且 key_type可复制插入 (CopyInsertable) 或可移动插入 (MoveInsertable) 到 *this 。此规定有缺陷并为 LWG 问题 2469 所修复,而上面的描述合并了该问题的解决方案。

然而,已知一个实现( libc++ )通过二个分离的分配器 construct() 调用构造 key_typemapped_type 对象,可认为如发布时的标准所要求,而非原位构造 value_type 对象。

operator[] 非 const ,因为若不关键不存在则它插入关键。若此行为非所欲或容器为 const ,则可用 at()

insert_or_assign() 返回的信息多于 operator[] ,而且不要求 mapped_type 可默认构造。

(C++17 起)

 

调用示例

#include <iostream>
#include <forward_list>
#include <string>
#include <iterator>
#include <algorithm>
#include <functional>
#include <map>
#include <time.h>using namespace std;struct Cell
{int x;int y;Cell() = default;Cell(int a, int b): x(a), y(b) {}Cell &operator +=(const Cell &cell){x += cell.x;y += cell.y;return *this;}Cell &operator +(const Cell &cell){x += cell.x;y += cell.y;return *this;}Cell &operator *(const Cell &cell){x *= cell.x;y *= cell.y;return *this;}Cell &operator ++(){x += 1;y += 1;return *this;}bool operator <(const Cell &cell) const{if (x == cell.x){return y < cell.y;}else{return x < cell.x;}}bool operator >(const Cell &cell) const{if (x == cell.x){return y > cell.y;}else{return x > cell.x;}}bool operator ==(const Cell &cell) const{return x == cell.x && y == cell.y;}
};struct myCompare
{bool operator()(const int &a, const int &b){return a < b;}
};std::ostream &operator<<(std::ostream &os, const Cell &cell)
{os << "{" << cell.x << "," << cell.y << "}";return os;
}std::ostream &operator<<(std::ostream &os, const std::pair<const int, Cell> &pCell)
{os << pCell.first << "-" << pCell.second;return os;
}int main()
{auto genKey = [](){return std::rand() % 10 + 100;};auto generate = [](){int n = std::rand() % 10 + 100;Cell cell{n, n};return cell;};std::map<int, Cell> map1;for (size_t index = 0; index < 5; index++){map1.insert({genKey(), generate()});}std::cout << "map1:    ";std::copy(map1.begin(), map1.end(),std::ostream_iterator<std::pair<const int, Cell>>(std::cout, " "));std::cout << std::endl;std::cout << std::endl;//返回到拥有等于 key 的关键的元素被映射值的引用。//若无这种元素,则抛出 std::out_of_range 类型异常。std::cout << "T& at( const Key& key );" << std::endl;for (const std::pair<int, Cell> it : map1){Cell cell = generate();map1.at(it.first) = cell;std::cout << "map1.at( " << it.first << " ) = " << cell << std::endl;}std::cout << std::endl;std::cout << "const T& at( const Key& key ) const;" << std::endl;for (const std::pair<int, Cell> it : map1){std::cout << "map1.at( " << it.first << " ) : " << map1.at(it.first) << std::endl;}std::cout << std::endl;std::cout << std::endl;//返回到映射到等于 key 的关键的值的引用,若这种关键不存在则进行插入。std::cout << "T& operator[]( const Key& key );" << std::endl;std::map<int, Cell> map2;while (map2.size() < 5){//1) 若关键不存在则插入 value_type(key, T()) 。//此函数等价于 return insert(std::make_pair(key, T())).first->second;map2[genKey()] = generate();}std::cout << "map2:    ";std::copy(map2.begin(), map2.end(),std::ostream_iterator<std::pair<const int, Cell>>(std::cout, " "));std::cout << std::endl;std::cout << std::endl;std::cout << "T& operator[]( Key&& key );" << std::endl;std::map<int, Cell> map3;while (map3.size() < 5){//1) 若关键不存在则插入 value_type(key, T()) 。//此函数等价于 return insert(std::make_pair(key, T())).first->second;map3[std::move(genKey())] = generate();}std::cout << "map3:    ";std::copy(map3.begin(), map3.end(),std::ostream_iterator<std::pair<const int, Cell>>(std::cout, " "));std::cout << std::endl;std::cout << std::endl;return 0;
}

输出

 

相关文章:

c++ 11标准模板(STL) std::map(四)

定义于头文件<map> template< class Key, class T, class Compare std::less<Key>, class Allocator std::allocator<std::pair<const Key, T> > > class map;(1)namespace pmr { template <class Key, class T, clas…...

6.开源非对称加密算法SM2实现

6.开源非对称加密算法SM2实现 前期内容导读&#xff1a; 开源加解密RSA/AES/SHA1/PGP/SM2/SM3/SM4介绍开源AES/SM4/3DES对称加密算法介绍及其实现开源AES/SM4/3DES对称加密算法的验证实现开源非对称加密算法RSA/SM2实现及其应用开源非对称加密算法RSA实现 1. 开源组件 非对称秘…...

Toolformer and Tool Learning(LLMs如何使用工具)

大模型的能力让学术和工业界都对通用人工智能的未来充满幻想&#xff0c;在前一篇博文中已经粗略介绍&#xff0c; Augmented Language Models&#xff08;增强语言模型&#xff09; ALM的两大思路是推理和工具&#xff0c;本篇博文整理两篇关于Toolformer或Tool Learning的论…...

029:Mapbox GL绘制铁路黑白交替的线段

第029个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载数据显示铁路标识的那种黑白交替的线段。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共94行)相关API参考:专栏目标示例效果 配置方式 1)…...

结对编程 --- 大部分程序员喜欢的编程方式

一、介绍 结对编程起源时间可以追溯到 1990 年代早期。这种编程方法最初由 Jim Highsmith 和 Alistair Cockburn 等人提出。后来&#xff0c;Kent Beck 和 Ward Cunningham 等人将其发展成为一种敏捷开发方法&#xff0c;被称为“极限编程”&#xff08;Extreme Programming&am…...

kubernetes-informer机制

一、概念 informer 是 client-go 中的核心工具包&#xff0c;在kubernetes中&#xff0c;各个组件通过HTTP协议跟 API Server 进行通信。如果各组件每次都直接和API Server 进行交互&#xff0c;会给API Server 和ETCD造成非常大的压力。在不依赖任何中间件的情况下&#xff0…...

LeetCode 2451. Odd String Difference【字符串,哈希表】简单

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

切片工具tippecanoe的全网最详细的解释

1.下载和安装 tippecanoe工具是mapbox官方提供的一个服务端切片工具,因此它是运行在服务器上的,它比较友好的支持mac和linux机器。对于windows来讲,就比较麻烦了。 首先对于mac系统,你只需配置好自己的homebrew,保证homebrew能够正常下载东西。 然后只需要一个命令: …...

Linux系统初始化命令的备忘单,Linux运维工程师收藏!

在管理和维护Linux系统时&#xff0c;有一些常用的命令可以帮助您进行系统初始化和配置。这些命令涵盖了各种任务&#xff0c;包括系统设置、用户管理、软件安装和网络配置等。 本文将为您提供一个Linux系统初始化命令的备忘单&#xff0c;以便在需要时方便查阅和使用。 系统设…...

五月最近一次面试,被阿里P8测开虐惨了...

都说金三银四涨薪季&#xff0c;我是着急忙慌的准备简历——5年软件测试经验&#xff0c;可独立测试大型产品项目&#xff0c;熟悉项目测试流程...薪资要求&#xff1f;5年测试经验起码能要个20K吧 我加班肝了一页半简历&#xff0c;投出去一周&#xff0c;面试电话倒是不少&a…...

工业机器视觉缺陷检测工作小结

工业机器视觉检测工作小结 &#xff08;因为网上没有很系统的讲义和文档&#xff0c;都是零零散散的&#xff0c;因此&#xff0c;我自己尝试着总结一下、仅供参考&#xff09; 你想知道的大概率在这都可以找到、相机的了解镜头的了解光源的了解传统算法DL深度学习方法 &#…...

技术笔记:默默耕耘,赢得铁粉的秘密策略!

目录 第一步&#xff1a;真实实践&#xff0c;价值分享第二步&#xff1a;高质量文章的撰写第三步&#xff1a;积极互动&#xff0c;回复评论和留言第四步&#xff1a;定期更新和持续学习第五步&#xff1a;参与技术社区第六步&#xff1a;社区问答和问题解答总结 导语&#xf…...

回收站中怎么找回误删除的文件?这几种方法很实用

当我们在电脑上操作文件的时候&#xff0c;难免会有不小心删除文件的情况发生。这个时候&#xff0c;我们可以打开回收站来找回误删除的文件。但是&#xff0c;有时候我们也会误将回收站清空。那么&#xff0c;该怎样才能找回已经误删除的文件呢&#xff1f;在这里提供了回收站…...

Gateway网关参数进行验签POST 包含requestbody 请求体封装

Gateway网关自定义拦截器的不可重复读取数据 特别注意一点, 因为在网关层 拿出 request 流之后,必须重写getbody()方法把所有的参数放进去,否则后面转发的请求无法接收到任何数据, 坑,巨坑,因为版本问题网上很多都不能兼容, 我的springboot环境 依赖包 <parent><gr…...

【Netty】字节缓冲区 ByteBuf (六)(上)

文章目录 前言一、ByteBuf类二、ByteBuffer 实现原理2.1 ByteBuffer 写入模式2.2 ByteBuffer 读取模式2.3 ByteBuffer 写入模式切换为读取模式2.4 clear() 与 compact() 方法2.5 ByteBuffer 使用案例 总结 前言 回顾Netty系列文章&#xff1a; Netty 概述&#xff08;一&…...

Python - 面向对象编程 - 实例方法、静态方法、类方法

实例方法 在类中定义的方法默认都是实例方法&#xff0c;前面几篇文章已经大量使用到实例方法 实例方法栗子 class PoloBlog:def __init__(self, name, age):print("自动调用构造方法")self.name nameself.age agedef test(self):print("一个实例方法&…...

性能测试——基本性能监控系统使用

这里写目录标题 一、基本性能监控系统组成二、环境搭建1、准备数据文件 type.db collectd.conf2、启动InfluxDB3、启动grafana4、启动collectd5、Grafana中配置数据源 一、基本性能监控系统组成 Collectd InfluxdDB Grafana Collectd 是一个守护(daemon)进程&#xff0c;用来…...

JavaCollection集合

5 Collection集合 5.1 Collection集合概述 是单列集合的顶层接口,它表示一组对象,这些对象也称Collection元素JDK不提供此接口的直接实现,它提供更具体的子接口(Set 和 List)实现package ceshi;import java.util.AbstractCollection; import java.util.ArrayList; import…...

C++中string的用法

博主简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的人。 博主主页&#xff1a;陈童学哦 所属专栏&#xff1a;CSTL 前言&#xff1a;Hello各位小伙伴们好&#xff01;欢迎来到本专栏CSTL的学习&#xff0c;本专栏旨在帮助大家了解…...

目标检测YOLO实战应用案例100讲-基于深度学习的交通场景多尺度目标检测算法研究与应用

目录 基于深度学习的交通目标检测算法研究 传统的目标检测算法 基于深度学习的目标检测算法 </...

Midscene.js 实战(二):通过 YAML 脚本实现 AI 驱动的自动化断言

前言:为什么你需要关注 YAML 脚本与 AI 断言? 2025年12月,字节跳动 Web Infra 团队正式发布了 Midscene v1.0。根据官方发布公告,Midscene 自 2024 年开源以来,已经在 GitHub 斩获 11k star、Trending 榜第二名等成绩,并在互联网、金融、政企、汽车等大量应用场景下完成…...

RHEL 9保姆级教程:手把手教你用阿里云镜像替换官方yum源(附完整命令)

RHEL 9极速配置指南&#xff1a;阿里云镜像源一键切换实战刚拿到RHEL 9服务器时&#xff0c;最令人抓狂的莫过于看着进度条像蜗牛一样缓慢爬行。官方源的速度不仅影响工作效率&#xff0c;更可能让紧急部署变成一场噩梦。本文将用最直白的操作语言&#xff0c;带你三步完成阿里…...

OFDM同步避坑指南:STO和CFO估计,选ML还是Classen算法?看这篇就够了

OFDM同步算法实战指南&#xff1a;如何在高干扰环境中选择最优STO/CFO估计方案无线通信工程师在设计OFDM系统时&#xff0c;往往会在同步环节遇到一个关键抉择&#xff1a;面对复杂的信道环境和严苛的性能要求&#xff0c;究竟该选择哪种同步算法组合&#xff1f;这个问题没有标…...

Cortex-R5不可中断事务机制与内存类型配置详解

1. Cortex-R5不可中断事务机制解析在实时嵌入式系统中&#xff0c;事务的原子性和可预测性往往至关重要。Cortex-R5作为一款面向实时应用的处理器&#xff0c;其内存事务的中断行为直接影响系统可靠性。当处理器核心响应中断异常时&#xff0c;按照Armv7-R架构规范&#xff0c;…...

PearSAN框架:用PearSOL损失与VCA采样破解纳米光子学逆设计难题

1. 项目概述&#xff1a;当机器学习遇上纳米光子学逆设计在纳米光子学领域&#xff0c;我们常常面临一个“反着来”的工程难题&#xff1a;给定一个我们梦寐以求的光学性能目标&#xff0c;比如在特定波段实现近乎完美的光吸收&#xff0c;如何从浩如烟海的可能结构中&#xff…...

量子机器学习在日志异常检测中的应用:QULOG框架解析与实践

1. 项目概述与核心价值日志异常检测&#xff08;Log-based Anomaly Detection, LogAD&#xff09;是智能运维&#xff08;AIOps&#xff09;的基石&#xff0c;其核心任务是从海量、半结构化、充满噪声的系统日志流中&#xff0c;自动识别出预示着潜在故障或异常行为的模式。随…...

仅剩72小时!Claude ROI计算模型企业定制版限时开放API对接权限(含AWS/Azure/GCP原生适配器)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Claude ROI计算模型企业定制版核心价值与限时策略 Claude ROI计算模型企业定制版并非通用模板的简单参数调整&#xff0c;而是基于客户实际业务流、成本结构与AI应用成熟度深度耦合的量化决策引擎。其核心价值…...

从Kaggle竞赛到业务落地:GBM特征重要性到底怎么看?用Python实战教你做模型可解释性分析

解密GBM特征重要性&#xff1a;从技术指标到业务决策的实战指南在金融风控和精准营销的实际业务场景中&#xff0c;数据科学家常常面临一个关键挑战&#xff1a;不仅要让模型预测准确&#xff0c;还要能够清晰解释模型决策的依据。GBM&#xff08;Gradient Boosting Machines&a…...

API接口签名验证实战

API接口签名验证实战 一、接口签名概述 API签名验证是保护接口安全的重要手段&#xff0c;防止请求被篡改或伪造。 1.1 签名机制原理 ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 客…...

Lindy流程自动化实施倒计时手册:仅剩最后23家企业获赠官方认证治理框架V2.3(含审计就绪检查表)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Lindy流程自动化实施倒计时手册发布背景与战略意义 在企业数字化转型加速演进的当下&#xff0c;重复性高、规则明确但跨系统耦合度强的业务流程正成为组织效能提升的关键瓶颈。Lindy流程自动化&#x…...