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

这篇具有很好参考价值的文章主要介绍了std::map使用方式以及注意事项(关于相同key的问题)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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的大小以及具体数据,它会显示什么呢?往下看:
std::map对键的要求,C++,c++,算法,数据结构
从这个结果我们已经看出来了map对于相同key值的处理方式:在已经存在一个key值是,如果我们执行插入相同的key值,算法不会覆盖原来的value,而且map中也不会存在两个相同的key,所以在使用map的时候我们需要注意这个问题,保证插入数据的时候每一组数据的key值是独一无二的。要不然可能会出现一些难以察觉的bug

完整测试代码:文章来源地址https://www.toymoban.com/news/detail-606311.html

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

到了这里,关于std::map使用方式以及注意事项(关于相同key的问题)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Tomcat中<Context>标签的使用方式和注意事项

    说明:是用于配置 Tomcat 中的 Web 应用程序上下文的元素(例:我现在需要部署两个Web应用,部署一个前端 web应用需要访问\\\"/“导航到主页面。后端 web应用需要访问”/admin\\\"导航到后端页面,我们现在就可以在使用一个Tomcat的情况下通过 Context 这个标签去配置来实现上面的功能

    2024年02月07日
    浏览(37)
  • xilinx FPGA IOB约束使用以及注意事项

    在xilinx FPGA中,IOB是位于IO附近的寄存器,是FPGA上距离IO最近的寄存器,同时位置固定。当你输入或者输出采用了IOB约束,那么就可以保证从IO到达寄存器或者从寄存器到达IO之间的走线延迟最短,同时由于IO的位置是固定的,即存在于IO附近,所以每一次编译都不会造成输入或

    2024年02月04日
    浏览(52)
  • 个人首次使用UniAPP使用注意事项以及踩坑

    uni-create-view 快速nui-app页面的 uni-helper uni-app代码提示的 uniapp小程序扩展 鼠标悬停查文档 TypeScript Vue Plugin (Volar) Vue Language Features (Volar) Eslint Prettier 禁用 Error Lens 行内提示报错 Turbo Console Log 打log插件 Code Spell Checker 检查拼写插件 files.associations 官网解释: https://cn.vuejs.org/guide/t

    2024年02月11日
    浏览(43)
  • sed中使用正则表达式进行替换以及注意事项

    sed中使用正则表达式进行替换的时候,一定要注意,有些特殊字符在使用时要转义,目前发现的有: 用于分组的小括号:(),在使用时要用进行转义,但是匹配字符串中真正的小括号时,无需转义; 表示前面的表达式出现次数的{},也要转义; 表示前面的表达式出现1次或多

    2023年04月22日
    浏览(44)
  • 如何使用Vscode开发Uni-app项目以及注意事项详解

    哟,大牛来了!!! 前言 :想必大家敲代码用的编辑器大多数都是Vscode吧,随着技术的更新,uni-app成为了前端不可或缺的一项技术,但是呢,官方推荐使用的HBuilderX编辑器让习惯了使用Vscode的我们不太习惯,虽然HBuilderX编辑器对uni-app极度的友好,但还是让在座的各位大牛以及

    2024年02月05日
    浏览(67)
  • 详细stm32驱动SDRAM的注意事项以及在keil中的使用

    容量:SDRAM的容量是指其可以存储的数据量,通常以兆字节(MB)或千兆字节(GB)为单位。 时钟频率:SDRAM的时钟频率指的是其内部时钟的速度,通常以兆赫(MHz)为单位。时钟频率越高,SDRAM的数据传输速度越快。 CAS延迟:CAS延迟是指SDRAM在接收到读取请求后,需要多长时

    2024年02月10日
    浏览(40)
  • 微信小程序wx.getFuzzyLocation获取经纬度的成功使用示例,以及注意事项

    注意事项: 1. 微信小程序基础库必须在 2.25.0及以上 才可以用这个接口,并且微信开发者工具也要是最新的 2.这个定位接口在编译器中报错,只有在 真机中好用 (偶尔在编译器中也好用),可以使用真机调试进行开发查看效果 上代码。 第一步:先在小程序公众平台    开发

    2024年02月11日
    浏览(55)
  • 【游戏】任天堂Nintendo Switch超详细购买/使用指南以及注意事项(根据自己使用持续更新中...)

    相信90后对于上面这张图片里的东西都很熟悉吧,各种游戏卡:超级玛丽,忍者龙剑传,忍者神龟,魂斗罗,热血篮球,冒险岛,双截龙,绿色兵团,洛克人,炸弹人,松鼠大战,赤色要塞等等。那时候一个超级玛丽,一玩就能玩一天,而超级玛丽就是任天堂开发的,而现在

    2024年02月10日
    浏览(39)
  • 关于websocket的几点注意事项

    2024年02月15日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包