「C/C++」C++ STL容器库 之 std::map 键值容器类

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「C/C++」C/C++程序设计
📚全部专栏
「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合
「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「PK」Parasolid函数说明
「Math」探秘数学世界

目录

    • `std::map` 容器详解
      • 注意事项
      • 引用头文件
      • 函数构造与对象初始化
      • 元素访问
      • 迭代器
      • 容器操作
      • 修改器
      • 元素比较
      • 总结

std::map 容器详解

std::map 是 C++ 标准模板库(STL)中的一种关联容器,用于存储键值对(key-value pairs)并根据键自动排序。它通常基于红黑树实现,提供了高效的插入、删除和查找操作。本文将详细介绍 std::map 的使用,包括注意事项、引用头文件、函数构造、对象初始化、元素访问、迭代器、容器操作、修改器和元素比较等方面,并通过代码示例进行说明。

注意事项

  1. 键的唯一性std::map 中的键是唯一的,如果插入具有相同键的多个元素,后插入的元素会覆盖先前的元素。
  2. 自动排序std::map 会根据键的默认比较方式(通常是 < 运算符)自动排序元素。
  3. 复杂度:插入、删除和查找操作的时间复杂度通常为 O(log n),其中 n 是容器中元素的数量。
  4. 内存分配std::map 可能会动态分配内存来存储元素,因此在使用时需要注意内存管理。

引用头文件

要使用 std::map,首先需要包含 <map> 头文件:

#include <map>

函数构造与对象初始化

std::map 提供了多种构造函数来初始化容器。

#include <iostream>
#include <map>
#include <string>int main() {// 默认构造函数std::map<int, std::string> map1;// 使用列表初始化std::map<int, std::string> map2 = {{1, "one"},{2, "two"},{3, "three"}};// 使用范围初始化(假设有另一个 map 或 pair 数组)// std::map<int, std::string> map3(map2.begin(), map2.end());return 0;
}

元素访问

可以通过键直接访问元素,也可以使用 find 函数来查找元素。

#include <iostream>
#include <map>
#include <string>int main() {std::map<int, std::string> map = {{1, "one"},{2, "two"},{3, "three"}};// 通过键直接访问std::cout << "Key 1: " << map[1] << std::endl;// 使用 find 函数auto it = map.find(2);if (it != map.end()) {std::cout << "Key 2: " << it->second << std::endl;} else {std::cout << "Key 2 not found." << std::endl;}// 尝试访问不存在的键(会插入新元素)std::cout << "Key 4 (new): " << map[4] << std::endl; // 输出默认值,并插入 {4, ""}return 0;
}

迭代器

std::map 提供了迭代器来遍历容器中的元素。

#include <iostream>
#include <map>
#include <string>int main() {std::map<int, std::string> map = {{1, "one"},{2, "two"},{3, "three"}};// 使用迭代器遍历for (auto it = map.begin(); it != map.end(); ++it) {std::cout << "Key: " << it->first << ", Value: " << it->second << std::endl;}// 使用范围 for 循环遍历for (const auto& pair : map) {std::cout << "Key: " << pair.first << ", Value: " << pair.second << std::endl;}return 0;
}

容器操作

std::map 提供了一些成员函数来管理容器,例如 sizeemptyclear 等。

#include <iostream>
#include <map>
#include <string>int main() {std::map<int, std::string> map = {{1, "one"},{2, "two"},{3, "three"}};// 获取容器大小std::cout << "Size: " << map.size() << std::endl;// 检查容器是否为空std::cout << "Is empty: " << std::boolalpha << map.empty() << std::endl;// 清空容器map.clear();std::cout << "After clear, is empty: " << std::boolalpha << map.empty() << std::endl;return 0;
}

修改器

std::map 提供了多种修改元素的方法,例如 inserteraseoperator[] 等。

#include <iostream>
#include <map>
#include <string>int main() {std::map<int, std::string> map = {{1, "one"},{2, "two"},{3, "three"}};// 插入新元素auto result = map.insert({4, "four"});if (result.second) {std::cout << "Inserted Key 4: " << result.first->first << ", Value: " << result.first->second << std::endl;} else {std::cout << "Insertion failed, key 4 already exists." << std::endl;}// 使用 operator[] 修改元素(如果键不存在,则插入新元素)map[2] = "TWO";std::cout << "Modified Key 2: " << map[2] << std::endl;// 删除元素map.erase(3);std::cout << "After erase key 3, is key 3 in map? " << std::boolalpha << (map.find(3) != map.end()) << std::endl;return 0;
}

元素比较

std::map 中的元素按键自动排序,默认使用 < 运算符进行比较。如果需要自定义比较方式,可以传递自定义的比较函数对象或仿函数。

#include <iostream>
#include <map>
#include <string>
#include <functional> // for std::greaterstruct CustomCompare {bool operator()(int lhs, int rhs) const {return lhs > rhs; // 降序比较}
};int main() {// 默认按升序排序std::map<int, std::string> map1 = {{3, "three"},{1, "one"},{2, "two"}};for (const auto& pair : map1) {std::cout << "Key: " << pair.first << ", Value: " << pair.second << std::endl;}// 使用自定义比较器按降序排序std::map<int, std::string, CustomCompare> map2 = {{3, "three"},{1, "one"},{2, "two"}};for (const auto& pair : map2) {std::cout << "Key: " << pair.first << ", Value: " << pair.second << std::endl;}// 使用 std::greater 作为比较器std::map<int, std::string, std::greater<int>> map3 = {{3, "three"},{1, "one"},{2, "two"}};for (const auto& pair : map3) {std::cout << "Key: " << pair.first << ", Value: " << pair.second << std::endl;}return 0;
}

总结

std::map 是一种功能强大的关联容器,适用于需要按键快速查找、插入和删除元素的场景。通过掌握其构造函数、元素访问、迭代器、容器操作、修改器和元素比较等常用方法,可以高效地利用 std::map 进行编程。本文详细介绍了 std::map 的使用方法和注意事项,并通过代码示例进行了说明,希望能帮助读者更好地理解和使用 std::map


在这里插入图片描述

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

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

相关文章

2024 第五次周赛

A: 直接遍历即可 #include<bits/stdc.h> using namespace std;typedef long long ll; typedef pair<ll, ll>PII; const int N 2e6 10; const int MOD 998244353; const int INF 0X3F3F3F3F;int n, m; int main() {cin >> n;int cnt 0;for(int i 0; i …

Start SSM from stratch !!!

Start SSM from stratch !!! 数据库两个数据库可以共存吗&#xff1f;常见的关系数据库常见的非关系数据库数据库可视化管理工具 java版本reviewee and se?jdk1.7 or jdk7? mysql安装版本对应关系下载[MySQL](https://downloads.mysql.com/archives/installer/)下载[Connecto…

[C++11] 类中新特性的添加

默认的移动构造和移动赋值 在 C11 之前&#xff0c;编译器会为每个类自动生成默认的构造函数、析构函数、拷贝构造函数、拷贝赋值运算符等函数&#xff0c;以实现对象的创建、销毁和拷贝操作。但拷贝操作会复制整个对象的数据&#xff0c;效率低&#xff0c;尤其是在处理大对象…

AI 写作(六):核心技术与多元应用(6/10)

一、AI 写作的核心技术概述 AI 写作在当今数字化时代正发挥着越来越重要的作用。它不仅极大地提高了写作效率&#xff0c;还为不同领域带来了创新的可能性。 AI 写作的核心技术主要包括基于模板的文本生成和基于深度学习的文本生成。基于模板的文本生成通常依赖预先设定的模板…

用 Python 从零开始创建神经网络(三):添加层级(Adding Layers)

添加层级&#xff08;Adding Layers&#xff09; 引言1. Training Data2. Dense Layer Class 引言 我们构建的神经网络变得越来越受人尊敬&#xff0c;但目前我们只有一层。当神经网络具有两层或更多隐藏层时&#xff0c;它们变成了“深度”网络。目前我们只有一层&#xff0c…

ClickHouse 24.10 版本发布说明

本文字数&#xff1a;13817&#xff1b;估计阅读时间&#xff1a;35 分钟 作者&#xff1a;ClickHouse Team 本文在公众号【ClickHouseInc】首发 又到了新版本发布的时间&#xff01; 发布概要 本次ClickHouse 24.10 版本包含了25个新功能&#x1f381;、15项性能优化&#x1f…

AI4SCIENSE(鄂维南院士:再谈AI for Science)

鄂维南院士&#xff1a;再谈AI for Science_哔哩哔哩_bilibili 以往处理高维问题 量子力学&#xff1a;单变量乘积 统计学&#xff1a;旋转 AI4S 处理数据 蛋白质折叠&#xff1f; 不是纯粹的数据驱动 物理学等学科基本原理 例&#xff1a;分子动力学 数据模型 流程图 这…

华为云全新上线Serverless应用中心,支持一键构建文生图应用

近日&#xff0c;华为云全新上线Serverless应用中心&#xff0c;提供大量应用模板&#xff0c;帮助用户实现一键部署函数和周边依赖资源&#xff0c;节省部署时间&#xff0c;快速上手将应用部署到华为云函数工作流FunctionGraph&#xff0c;并一键开通周边依赖资源。 体验入口…

F5-TTS 整合包详细部署文档1110更新

F5-TTS 整合包详细部署文档&#xff1a;1110更新 F5-TTS 整合包详细部署教程1110更新 更新内容 本次更新加入了通义千问对话模型&#xff0c;以增强F5-TTS的功能和性能。 下载相关资源 F5-TTS文本转语音 链接&#xff1a;F5-TTS资源下载 文件列表 文件名大小说明01-主程序…

【bayes-Transformer-GRU多维时序预测】多变量输入模型。matlab代码,2023b及其以上

% 1. 数据准备 X_train 训练数据输入; Y_train 训练数据输出; X_test 测试数据输入; % 2. 模型构建 inputSize size(X_train, 2); numHiddenUnits 100; numResponses 1; layers [ … sequenceInputLayer(inputSize) biLSTMLayer(numHiddenUnits, ‘OutputMode’, ‘se…

AUTOSAR CP TCP/IP堆栈规范导读

一、规范的主要内容 该规范是AUTOSAR中关于TCP/IP堆栈的规范&#xff0c;主要内容包括以下几个方面&#xff1a; 总体介绍 功能概述&#xff1a;提供了发送和接收互联网协议数据的功能&#xff0c;位于Socket Adaptor和以太网接口模块之间。文档信息&#xff1a;包含文档标题…

redis安装

Redis的安装配置 安装Redis 安装gcc依赖 Redis是使用C语言编写的&#xff0c;Linux上并没有C语言的编译器&#xff0c;需要手动安装 yum install -y gcc tcl上传安装包并解压 将压缩包放在任意目录解压 tar -xzf redis-6.2.6.tar.gz安装 1.进入redis目录 cd redis-6.2.62.运行…

Linux系统程序设计--3. 文件操作

文件属性 存放文件属性的结构体 文件属性操操作函数 文件类型(7种) - 普通文件d目录p 管道文件l 符号链接(软链接) 判断文件类型的小程序 #include<sys/types.h> #include<sys/stat.h> #include<string.h> #include<stdio.h> #include<memory.h&…

单词反转和数组去重,附经典面试题一份

博彦科技笔试&#xff1a; 给定字符&#xff0c;拼接成单词进行反转单词&#xff1b; package org.example;public class Main {public static void main(String[] args) {char[] input {h, e, l, l, o, , w, o, r, l, d, , J, a, v, a};String inputToString new String(…

HTB:Precious[WriteUP]

目录 连接至HTB服务器并启动靶机 使用nmap对靶机TCP端口进行开放扫描 使用curl访问靶机80端口 使用ffuf爆破一下子域 使用浏览器访问该域名 使用curl访问该域名响应头 使用exiftool工具查看该pdf信息 横向移动 USER_FLAG&#xff1a;adf5793a876a190f0c08b3b6247cec32…

【2024.11.10实测有效:Win11右键默认显示更多设置教程】

winX 选择管理员 reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve# 再 taskkill /f /im explorer.exe & start explorer.exe! none taskkill /f /im explorer.exe; start explorer.exe

环形链表问题(图 + 证明 + 题)

文章目录 判断链表是否有环返回链表开始入环的第一个结点 判断链表是否有环 题目链接 思路&#xff1a; 可以明确的是&#xff1a;若一个链表带环&#xff0c;那么用指针一直顺着链表遍历&#xff0c;最终会回到某个地方。 我们可以定义两个指针&#xff08;快慢指针&#xf…

【优选算法 — 滑动窗口】最大连续1的个数 将 x 减到0的最小操作数

最大连续1的个数 最大连续1的个数 题目描述 题目解析 给我们一个元素全是0或者1的数组&#xff0c;和一个整数 k &#xff0c;然后让我们在数组选出最多的 k 个0&#xff1b;这里翻转最多 k 个0的意思&#xff0c;是翻转 0 的个数< k&#xff0c;而不是一定要翻转 k …

HTML基础

1.HTML基本结构标签 在Visual Studio Code中&#xff0c;使用&#xff01;回车就可以创建一个HTML的基本结构 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"wi…

CSM快速匹配与多分辨率匹配代码实现

0. 简介 CSM在Cartographer中是比较基础且非常适合拓展的功能。他主要的步骤如下图。 主要实现的步骤为&#xff1a; 1&#xff09;获取先验位姿&#xff0c;通过TF获取里程计的值&#xff0c;作为当前scan的预测位姿&#xff0c;将这个预测位姿当做扫描匹配的先验。 2&…