std::map使用方式以及注意事项(关于相同key的问题)

news2024/9/25 19:24:38

std::map的使用在C++开发中也是经常会用到的一些东西,这里进行一些简单的使用记录,包括如何插入、删除以及修改等。

1、std::map插入:

map的插入使用的是insert的方式,一个map包含了key与value两个值。首先需要对两个值进行赋值,然后对map执行insert操作,简单代码如下:

	std::map<string,string> test_map;
	string mapkey;
    string mapvalue;
    mapkey = "key1";
    mapvalue = "value1";
    test_map.insert(map<string,string>::value_type(mapkey,mapvalue));

2、std::map查询:

注意在map中,key值是唯一的,所以一般查寻数据时我们都会查寻key值,map中的key值查寻使用find函数:

	std::map<string,string>::iterator iter;
	iter = test_map.find("key1");
    if(iter!=test_map.end())
    {
    //处理函数
    }

如果key值存在,则进入if语句,否则进入else

3、std::map删除:

map的删除使用的也是erase的方式,但是与容器不同,如果要删除整个map的话,可以通过:

	test_map.erase();

这样子的形式,执行该语句可以清空整个test_map。但是如果要执行单独删除某个数据的话,需要通过指针的形式来完成:

    iter = test_map.find("key1");
    if(iter!=test_map.end())
    {
        iter = test_map.erase(iter);
    }

上述的语句执行的是删除map中key值为key1的数据。

4、std::map遍历:

map的遍历跟容器不同,它一般通过迭代器进行遍历:

	std::map<string,string>::iterator ite;
    for(ite=test_map.begin();ite!=test_map.end();ite++)
    {
        cout<<"key:"<<ite->first<<"  value:"<<ite->second<<endl;
    }

定义一个迭代器,然后从begin()开始,end()结尾。

5、std::map相同key值的问题:

在map中,value是可以重复的,但是key是不可以的。如果此时地图中已经存在一个key时,我们再插入一个相同的key,这时候会发生什么呢?报错?或者覆盖掉之前的key以及对应的value?又或者跳过不处理?

简单通过一个小代码我们可以测试一下这个问题:

	string mapkey;
    string mapvalue;
    mapkey = "key1";
    mapvalue = "value1";
    test_map.insert(map<string,string>::value_type(mapkey,mapvalue));
    mapkey = "key2";
    mapvalue = "value2";
    test_map.insert(map<string,string>::value_type(mapkey,mapvalue));
    mapkey = "key3";
    mapvalue = "value3";
    test_map.insert(map<string,string>::value_type(mapkey,mapvalue));
    mapkey = "key1";
    mapvalue = "value4";
    test_map.insert(map<string,string>::value_type(mapkey,mapvalue));
    cout<<"mapsize:"<<test_map.size()<<endl;
    std::map<string,string>::iterator iter;
    for(iter=test_map.begin();iter!=test_map.end();iter++)
    {
        cout<<"key:"<<iter->first<<"  value:"<<iter->second<<endl;
    }

在这个代码中,我们一共插入了四组数据。其中第四组数据与第一组数据的key值是相同的。然后我们打印一下map的大小以及具体数据,它会显示什么呢?往下看:
在这里插入图片描述
从这个结果我们已经看出来了map对于相同key值的处理方式:在已经存在一个key值是,如果我们执行插入相同的key值,算法不会覆盖原来的value,而且map中也不会存在两个相同的key,所以在使用map的时候我们需要注意这个问题,保证插入数据的时候每一组数据的key值是独一无二的。要不然可能会出现一些难以察觉的bug

完整测试代码:

#include "ros/ros.h"

using namespace std;
class map_test
{
private:
    /* data */
    std::map<string,string> test_map;
    
public:
    
    map_test(/* args */);
    ~map_test();
    void test();
};

map_test::map_test(/* args */)
{
    ros::NodeHandle n;
}

void map_test::test()
{
    string mapkey;
    string mapvalue;
    mapkey = "key1";
    mapvalue = "value1";
    test_map.insert(map<string,string>::value_type(mapkey,mapvalue));
    mapkey = "key2";
    mapvalue = "value2";
    test_map.insert(map<string,string>::value_type(mapkey,mapvalue));
    mapkey = "key3";
    mapvalue = "value3";
    test_map.insert(map<string,string>::value_type(mapkey,mapvalue));
    mapkey = "key1";
    mapvalue = "value4";
    test_map.insert(map<string,string>::value_type(mapkey,mapvalue));
    cout<<"mapsize:"<<test_map.size()<<endl;
    std::map<string,string>::iterator iter;
    for(iter=test_map.begin();iter!=test_map.end();iter++)
    {
        cout<<"key:"<<iter->first<<"  value:"<<iter->second<<endl;
    }
    iter = test_map.find("key1");
    if(iter!=test_map.end())
    {
        iter = test_map.erase(iter);
        mapkey = "key1";
        mapvalue = "value4";
        test_map.insert(map<string,string>::value_type(mapkey,mapvalue));
    }
    cout<<"mapsize:"<<test_map.size()<<endl;
    std::map<string,string>::iterator ite;
    for(ite=test_map.begin();ite!=test_map.end();ite++)
    {
        cout<<"key:"<<ite->first<<"  value:"<<ite->second<<endl;
    }

}
map_test::~map_test()
{
}


int main(int argc, char **argv)
{
    ros::init(argc,argv,"map_test");
    map_test map_test_;
    map_test_.test();
    ros::spin();
    return 0;
}

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

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

相关文章

Spring Security认证授权练手小项目 腾讯视频VIP权限管理功能

腾讯视频VIP权限管理1、项目功能视频演示2、需求与设计1、需求2、功能概要3、接口设计3、项目源码结构4、项目源码下载5、项目部署1、部署架构2、数据库环境准备3、redis环境准备4、Spring Boot服务准备5、nginx负载均衡准备6、nginx静态资源服务器准备6、项目介绍1、技术架构2…

人工智能-集成学习

1、 集成学习算法介绍 1.1 什么是集成学习 集成学习通过建立几个模型来解决单一预测问题。工作原理&#xff1a;生成多个分类器/模型&#xff0c;各自独立地学习和做出预测。这些预测再结合成组合预测&#xff0c;因此由于任何一个单分类的预测。 1.2 机器学习的两个核心任…

优化RPC网络通信

文章目录什么是RPC通信RPCRPC框架SOARPC通信得重要性具体优化措施1.扩展其他RPC框架.2.选择合适的通信协议3.使用单一长连接4.优化Socket通信.5.高性能的序列化协议6.量身定做报文格式什么是RPC通信 RPC RPC&#xff08;Remote Process Call&#xff09;&#xff0c;即远程服…

算法训练 —— 链表(2)

目录 1. LeetCode24. 两两交换链表中的结点 2. LeetCode19. 删除链表的倒数第N个节点 3. LeetCode160.相交链表 4. LeetCode141.环形链表 5. LeetCode142.环形链表II 6. LeetCode138.复制带随机指针的链表 1. LeetCode24. 两两交换链表中的结点 两两交换链表中的结点 …

机器学习时间序列特征处理与构造,这篇我建议你收藏

数据和特征决定了机器学习的上限&#xff0c;而模型和算法只是逼近这个上限而已。由此可见&#xff0c;特征工程在机器学习中占有相当重要的地位。在实际应用当中&#xff0c;可以说特征工程是机器学习成功的关键。 那特征工程是什么&#xff1f; 特征工程是利用数据领域的相关…

vue3 antd项目实战——Form表单使用【v-model双向绑定数据,form表单嵌套input输入框、Radio单选框】

vue3 ant design vue项目实战——单选框&#xff08;Radio&#xff09;的使用以及Form表单的双向绑定知识调用&#xff08;form表单的源代码附在文章最后&#xff09;场景复现实现需求form表单整体架构的搭建input输入框文本域的嵌套单选组合Radio的嵌套button按钮组合的嵌套fo…

小米手机不为人知的秘密—后台静默安装任何应用

导读你是否拥有一台小米&#xff0c;HTC&#xff0c;三星或者是一加的 Android 手机呢&#xff1f;如果回答是肯定的&#xff0c;那么你应该意识到&#xff0c;几乎所有的智能手机厂商提供的定制 ROM&#xff0c;如 CyanogenMod、Paranoid Android、 MIUI 或者一些其它的 ROM 都…

再谈指针(12)

目录 1、字符指针 2、指针数组 3、数组指针 1、定义 2、&数组名VS数组名 3、数组指针的使用 1、二维数组的数组名 4、数组参数、指针参数 1、一维数组传参 2、二维数组传参 3、一级指针传参 4、二级指针传参 5、函数指针 6、函数指针数组 7、指向函数指针数…

SpringCloud之Sleuth全链路日志跟踪

文章目录1 Sleuth链路跟踪1.1 分布式系统面临的问题1.2 Sleuth是什么1.3 Zipkin是什么1.4 链路监控相关术语1.5 实战练习1.5.1 pom.xml1.5.2 添加yml配置1.5.3 添加控制器1.5.4 测试访问1.6 Zipkin1.6.1 下载与启动1.6.2 搭建链路监控步骤1.6.2.1 搭建8990提供者1.6.2.2 搭建89…

08 `.o`中的汇编信息 hopper disassembler 调试 HelloWorld

前言 上周[2020.05.23]想要 直接使用 fastdebug 版本的 jdk 来进行调试, 可惜失败了 原来是 缺少 可执行文件关联的, object file, 里面记录了 关联的源码的一些信息 看来还是 免不了, 需要 手动 编译 open jdk, 哎 本文主要是两个东西 : 1. 查看 object file 中的汇编信…

CSS权威指南(一)CSS概述

文章目录1.元素2.引入样式表3.样式表4.媒体查询5.特性查询1.元素 &#xff08;1&#xff09;置换元素和非置换元素 置换元素&#xff0c;指用来置换元素内容的部分不由文档内容直接表示。比如img标签。非置换元素&#xff0c;元素的内容是由用户代理在元素自身生成的框中显示…

这样的C盘或许还有?救救C盘......

C盘红了&#xff01;&#xff01;&#xff01; 大部分软件默认缓存在C盘&#xff08;有的甚至只能安装到C盘&#xff09; C盘太满电脑运行会很卡顿 对于这种情况&#xff0c;为了节约C盘空间&#xff0c;我们可以将这些被迫存在C盘的文件挪到其他盘 但是有的应用无法更改默…

C++ 显示图片

编译环境为codeblocks 20.03&#xff0c;编译器为mingw64非自带的版本&#xff08;版本号多少忘记了&#xff09; 头文件 #include <graphics.h>//图形库 #include <conio.h>//_getch() 显示图片代码 int main() {initgraph(640,360,EX_SHOWCONSOLE);//初始化绘…

我亲身经历的2022年软件质量工作——测试工作的经验总结及一些建议

2022年对于大部分人来说都是辛苦的一年。对于整个社会&#xff0c;疫情反反复复&#xff0c;折磨的每一个人都心力交瘁。 经济下滑&#xff0c;失业率上升似乎听到的都是不好的消息。对于整个互联网行业也频频传出大厂裁员的消息。 而质量团队在大厂的裁员计划里也是首当其冲。…

4)Django模型,表单,视图,路由

目录 一 Django模型 Django ORM 数据库配置 Django 如何使用 mysql 数据库 实例 定义模型 创建 APP 数据库操作 添加数据 获取数据 更新数据 删除数据 二 Django 表单 HTTP 请求 GET 方法 POST 方法 Request 对象 QueryDict对象 三 Django视图 视图层 请求…

Vault的程序侧接入方式-AppRole

前言&#xff1a; 程序侧的接入对于Vault来说也是一种Accessor的接入&#xff0c;而AppRole绝对不是Vault首推的程序侧接入方式&#xff0c;但它是最方便的接入方式。 AppRole的本质是由Vault为程序单独引入一套由Vault托管的鉴权方式&#xff0c;对于安全平台来说没引入一套…

videojs-flvjs:video.js + flv.js播放m3u8和flv视频

videojs-flvjs是video.js的扩展&#xff0c;让video.js支持flv.js播放器&#xff0c;可以在video.js的techOrder里配置flvjs播放器。 下面做了一个切换m3u8和flv直播流的简易工具&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta ch…

线程安全(万字详解)

目录 线程安全 概念 用一段代码感受线程安全 线程安全问题的原因 修改上述代码,使其线程安全 synchronized synchronized使用方法 锁对象的规则 synchronized用法,代码展示 monitor lock sychronized的特性 java标准库中的线程安全类 死锁 死锁的常见原因 多个…

LVGL学习笔记9 - 标签Label

目录 1. 显示字符串 1.1 lv_label_set_text 1.2 lv_label_set_text_fmt 1.3 lv_label_set_text_static 2. 设置长字符串模式 3. 改变颜色 3.1 改变背景颜色和对比度 3.2 设置字符串颜色 3.2.1 设置Style的字符串颜色 3.2.2 设置对象的字符串颜色 3.2.3 局部改色 显示…

钧瓷产业将占禹州GDP50%以上,产生千亿市值钧瓷生态型科技公司

这里的上市指沪深的主板&#xff0c;创业板和科创板&#xff0c;区域的挂牌不算。 这个数据是根据禹州钧瓷产业2022年实际税收&#xff0c;综合钧瓷产业报税幅度&#xff0c;钧瓷数据开放平台&#xff0c;钧瓷产业决策内参&#xff0c;钧瓷产业化&#xff0c; 数字化后的预期增…